美文网首页
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

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

相关文章

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • 聊聊Context

    在上篇文章《设计模式之装饰模式》中我们谈到了装饰模式,在 Android 中关于 Context 的设计就用到了装...

  • 9、结构型模式-装饰器设计模式

    1、如虎添翼的设计模式-装饰器设计模式 简介:讲解-装饰器设计模式介绍和应用场景 装饰器设计模式(Decorato...

  • Java设计模式之装饰器模式

    Java设计模式之装饰器模式 本文仅是个人观点,如有错误请指正 简介 装饰器模式(Decorator Patter...

  • Golang 设计模式之-装饰模式

    Golang 设计模式之-装饰模式 最近在温习设计模式,虽然面向对象不是go的特长,但用go实现的设计模式,比ja...

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • 修饰模式

    维基百科-修饰模式 php 设计模式 之 装饰模式 hero博客——装饰模式 动态的给一个对象添加一些额外的职责,...

  • Java设计模式之 —— 装饰者(Decorator) — 点

    Java设计模式之 —— 装饰者(Decorator) — 点炒饭 下面会用做炒饭的例子来描述一下装饰者设计模式,...

  • 设计模式之-装饰模式

    好了,昨天我们说完了单利模式,趁着现在想写博客就多写几篇吧. 下面开始说这个装饰模式 装饰模式其实还有做成一个类,...

  • 设计模式之装饰模式

    将所有功能建立在继承体系上会导致系统中的类爆炸式的增多。更糟糕的是当你尝试继承数上不同的分支做相似的修改时,代码会...

网友评论

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

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