23种设计模式之装饰模式

优点:可以降低系统耦合度,给对象新增功能。
缺点:会产生过多的相似对象,多层装饰情况下比较复杂,层层嵌套,不容易发下问题所在。

例子:比如给一个普通手机,我得建一个类,我需要添加指纹解锁又得建一个类,添加人脸识别又要一个类,如果需要人脸识别以及指纹解锁都具备的手机又得添加一个类,这样的类膨胀对维护很不好,这种情况下可以使用装饰模式,对它们进行任意组合,装饰模式需要以下4个角色。

  • Component:抽象构件,让真实对象和装饰对象拥有相同的接口。
  • ConcreteComponent:具体构件角色,也就是真实对象。
  • Decorator:装饰角色,持有一个抽象构件的引用。
  • ConcreteDecorator:具体装饰角色,负责给对象增添新的功能。

先创建一个Component(抽象构件):

/**
 * 这是一个Component(抽象构件)
 * 拥有一个打电话功能
 */

public interface IPhone {
    void call();
}

然后创建一个ConcreteComponent(具体构件角色),并实现IPhone 接口:

import android.util.Log;

/**
 * 这是一个ConcreteComponent(具体构件角色)
 */

public class Phone implements IPhone {
    @Override
    public void call() {
        Log.d("TAG","打电话");
    }
}

然后创建一个装饰器,Decorator(装饰角色),并实现IPhone 接口:

/**
 * 这是一个Decorator(装饰角色)
 */

public class SmartPhone implements IPhone {
    protected IPhone iPhone;

    public SmartPhone(IPhone iPhone) {
        this.iPhone = iPhone;
    }

    @Override
    public void call() {
        iPhone.call();
    }
}

然后添加ConcreteDecorator(具体装饰角色),指纹解锁:

import android.util.Log;

/**
 * 这是一个ConcreteDecorator(具体装饰角色)
 * 指纹解锁
 */

public class FingerprintUnlockPhone extends SmartPhone {

    public FingerprintUnlockPhone(IPhone iPhone) {
        super(iPhone);
    }

    public void fingerprintUnlock() {
        Log.d("TAG", "添加了指纹解锁");
    }

    @Override
    public void call() {
        super.call();
        fingerprintUnlock();
    }
}

人脸识别:

import android.util.Log;

/**
 * 这是一个ConcreteDecorator(具体装饰角色)
 * 人脸识别
 */

public class FaceRecognitionPhone extends SmartPhone {

    public FaceRecognitionPhone(IPhone iPhone) {
        super(iPhone);
    }

    public void faceRecognition() {
        Log.d("TAG", "添加了人脸识别");
    }

    @Override
    public void call() {
        super.call();
        faceRecognition();
    }
}

该有的角色都有了,调用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;

/**
 * 这是调用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个普通手机
        Phone phone = new Phone();
        phone.call();

        //添加了指纹解锁的手机
        FingerprintUnlockPhone fingerprintUnlockPhone = new FingerprintUnlockPhone(phone);
        fingerprintUnlockPhone.call();

        //添加了人脸识别的手机
        FaceRecognitionPhone faceRecognitionPhone = new FaceRecognitionPhone(phone);
        faceRecognitionPhone.call();

        //添加了指纹解锁和人脸识别的手机
        FaceRecognitionPhone faceRecognitionPhone2 = new FaceRecognitionPhone(fingerprintUnlockPhone);
        faceRecognitionPhone2.call();

    }
}

结果:
23种设计模式之装饰模式_第1张图片
image.png

很灵活的自由组合方式。
已完成测试!有不对的地方欢迎指出,感恩。

你可能感兴趣的:(23种设计模式之装饰模式)