Android设计模式:装饰设计模式

  • 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

  • 抽象组件:可以是抽象类或接口,是被装饰类的原始对象

  • 组件具体实现类:该类是抽象组件的具体实现,也是我们装饰的具体对象。

  • 抽象装饰者:为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的子类。如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者。

  • 具体装饰者:对抽象装饰做具体的实现。

(1)装饰设计模式

  • 抽象组件类
public interface Person {
    String combination();
}
  • 具体组件实现类
public class PersonZ implements Person {
    @Override
    public String combination() {
        return "小张";
    }
}

public class PersonL implements Person {
    @Override
    public String combination() {
        return "小李";
    }
}

public class PersonW implements Person {
    @Override
    public String combination() {
        return "小王";
    }
}
  • 抽象的装饰者
public abstract class PersonDecorator implements Person {
    private Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    @Override
    public String combination() {
        return person.combination();
    }
}

具体的装饰者

public class RedPants extends PersonDecorator {
    public RedPants(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show(){
        return "红色上衣";
    }
}

public class WhitePants extends PersonDecorator {
    public WhitePants(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show(){
        return "白色上衣";
    }
}

public class RedJacket extends PersonDecorator {
    public RedJacket(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show() {
        return "红色裤子";
    }
}

public class WhiteJacket extends PersonDecorator {
    public WhiteJacket(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show(){
        return "白色裤子";
    }
}

public class RedShoes extends PersonDecorator {
    public RedShoes(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show(){
        return "红色鞋子";
    }
}

public class WhiteShoes extends PersonDecorator {
    public WhiteShoes(Person person) {
        super(person);
    }

    @Override
    public String combination() {
        return super.combination() + show();
    }

    private String show() {
        return "白色鞋子";
    }
}
  • 具体调用
Person person = new PersonZ();
PersonDecorator redPants = new RedPants(person);
redPants.combination();
PersonDecorator whiteJacket = new WhiteJacket(person);
whiteJacket.combination();
PersonDecorator whiteShoes = new WhiteShoes(person);
whiteShoes.combination();

优点

  • 采用组合的方式,可以动态的扩展功能,同时也可以在运行时选择不同的装饰器,来实现不同的功能。
  • 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
  • 被装饰者与装饰者解偶,被装饰者可以不知道装饰者的存在,同时新增功能时原有代码也无需改变,符合开放封闭原则。

缺点

  • 装饰层过多的话,维护起来比较困难。
  • 如果要修改抽象组件这个基类的话,后面的一些子类可能也需跟着修改,较容易出错。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,786评论 0 14
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,970评论 1 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • 文/孤鸟差鱼 我一直等 一直等 等到天黑 没等来反方向的车 执着错了地方 没用
    孤鸟差鱼阅读 213评论 0 2
  • 亚索传全书目录 上一章:往事如风 亚索于长者原居之所发现了提莫设置的毒菇陷阱,他认定长者被杀之时,善于隐身术的提莫...
    小林呆阅读 760评论 2 4