美文网首页
23种设计模式之装饰模式

23种设计模式之装饰模式

作者: 阿跳爱学习 | 来源:发表于2019-01-07 19:31 被阅读0次

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

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

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

    相关文章

      网友评论

          本文标题:23种设计模式之装饰模式

          本文链接:https://www.haomeiwen.com/subject/tnburqtx.html