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();

    }
}

结果:
image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (转载)原文地址 在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又...
    zjk_00阅读 652评论 0 2
  • 【学习难度:★★★☆☆,使用频率:★★★☆☆】直接出处:装饰模式梳理和学习:https://github.com/...
    BruceOuyang阅读 747评论 2 2
  • 在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapp...
    聂叼叼阅读 355评论 1 2
  • 开学了,一波又一波的高温终于结束了,从前一晚不开空调要被热死一下进入不盖被子要被冻死,我大重庆的天气就是这么敢爱敢...
    LAA06阅读 493评论 3 3
  • (1)道教是中国本土宗教,以``道``为最好信仰。(2)道教在中国古代鬼神崇拜观念上,是神仙化的。最高神以``玉皇...
    微博一笑阅读 380评论 0 0