设计模式-装饰模式学习笔记

装饰模式(结构型模式)

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

自己的理解在不对原有类进行修改的情况下动态的对它进行扩展一些功能


  • 优缺点

优点:

  1. 满足开闭原则
  2. 能够动态的增删功能,比继承更灵活

缺点:

  1. 会多出很多小类,增加了程序的复杂性
  2. 难以排错(多级装饰的对象,排错需要逐级排查)

  • 特点
  1. 装饰对象和被装饰对象有共同的父类
  2. 装饰对象持有一个被装饰对象的实例(体现为拥有一个属性是父接口的对象)
  3. 装饰对象对调用方传过来的请求会转发给被装饰对象(体现为所有的子装饰类在操作时都会调用装饰类的方法,而装饰类会通过调用父接口对象的方法去调用被装饰对象的方法)
  4. 子装饰类在调用装饰对象的方法时会新增其他一些附加功能(装饰模式的意义)

  • 结构

Component:装饰对象和被装饰对象的共同父类

ConcreteComponent:被装饰类,也为具体实现类

Decorator:装饰类,自装饰类的父类

ConcreteDecoratorA:子装饰类,提供特定的装饰

ConcreteDecoratorB:子装饰类,提供特定的装饰

更多的ConcreteDecorator(C,D,E,F)


  • 代码

例子:武装机甲,一台机甲,没有任何装备,现在需要给机甲装上各种装备,机甲是被装饰对象,给机甲新增装备为装饰类,动态的添加武器装备和防具装备

被装饰对象与装饰对象的共同父类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:02
 * @ Description:装饰对象和被装饰对象的共同父类
 */
public interface Component {
     void operation();
}

  被装饰对象,拥有完整的操作

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:06
 * @ Description:被装饰者对象   机甲类
 */
public class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("末日机甲前来报道,装备:");
    }
}

  装饰类,持有一个被装饰对象的引用,并且在被调用时,调用被装饰对象的方法

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:09
 * @ Description:装饰类
 */
public abstract class Decorator implements Component {

    //持有一个被装饰对象的引用
    private Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if(component != null){
            component.operation();
        }
    }
}

  子装饰类,在调用提供特定的装饰操作时,调用父类方法

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:18
 * @ Description:具体装饰类  机甲装备武器改装类
 */
public class ConcreteDecoratorA extends Decorator{
    @Override
    public void operation() {
        super.operation();
        System.out.println("改装:等离子高频激光剑");
    }
}

  同上

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:28
 * @ Description:具体装饰类  机甲装备防具改装类
 */
public class ConcreteDecoratorB extends Decorator{
    @Override
    public void operation() {
        super.operation();
        System.out.println("改装:全适应立场防护盾");
    }
}

        客户端调用类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/13 3:00
 * @ Description:客户端调用类
 */
public class TestController {
    public void print(){
        ConcreteComponent concreteComponent = new ConcreteComponent();
        ConcreteDecoratorA cA = new ConcreteDecoratorA();
        ConcreteDecoratorB cB = new ConcreteDecoratorB();
        cA.setComponent(concreteComponent);
        cB.setComponent(cA);
        cB.operation();
    }
}

  

输出结果:

末日机甲前来报到,装备:
改装:等离子高频激光剑
改装:全适应立场防护盾  

  


  • 总结

装饰模式能动态的扩展一个类,并且不修改原来的类,能够灵活的增删,比继承要好。(感觉作用和代理模式有点象^_^)

(0)

相关推荐

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

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • PHP设计模式—装饰器模式

    定义: 装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活. 结构: Component:定义一个对象接口,可以给这些对象动态地添加职责. ...

  • 设计模式(9) 装饰模式

    装饰模式 装饰模式的特点 动态撤销功能 装饰模式可以动态向一个现有的对象添加新的功能,同时又不改变其结构.就增加功能来说,使用继承的方式生成子类也可以达到目的,但随着扩展功能的不断增加,子类的数量会快 ...

  • 技术图文:03 结构型设计模式(下)

    结构型设计模式(下) 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结. 知识结构: 图1 知识结构 组合模式 -- 树形结构的处理 Sunny 软件公司欲开发一个杀毒( ...

  • DercoratorPattern装饰者模式

    装饰者模式 1,定义 动态的给一个对象添加一些额外的职责. 装饰者模式通常有4个角色,就增加功能来说,装饰者模式比生成子类更加的灵活. Component:抽象构件.通常是一个接口或者抽象类,定义最核 ...

  • C#设计模式学习笔记:(8)装饰模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7723225.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第三个模式--装 ...

  • C#设计模式学习笔记:(21)访问者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8135083.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第九个模式--访 ...

  • 设计模式学习笔记 ———— 简单工厂模式

    # 背景 简单工厂模式是很多程序员学习的第一个设计模式,因为其不但原理简单而且易于上手,在日常工作的代码中也常有体现.今天分享一个基于实现"加"."减".&qu ...

  • 设计模式学习笔记

    由 杨柳依 创建于2019年11月3日,最近更新于2019年11月8日 参考资料:大话设计模式 | 图解设计模式 | 菜鸟教程-设计模式 UML类图 [矩形框]代表一个类(Class).类图分三层: ...

  • 设计模式-工厂方法模式学习笔记

    工厂方法模式 定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负 ...

  • 流畅的python学习笔记(三):把函数视作对象(2:使用一等函数实现设计模式 )

    流畅的python学习笔记(三):把函数视作对象(2:使用一等函数实现设计模式 )

  • Event Bus 设计模式学习笔记

    原文:Design Patterns: Event Bus Motivation 想象一下,有一个包含大量相互交互的组件的大型应用程序,并且您想要一种方法使您的组件进行通信,同时保持松散耦合和关注点分 ...

  • 一则公报案例学习笔记:对修改股东出资期限应否适用资本多数决规则的思考|审判研究

    一.问题的提出 2021年第3期<最高人民法院公报案例>刊登了鸿大(上海)投资管理有限公司与姚锦城公司决议纠纷上诉案,裁判要旨为:"公司股东滥用控股地位,以多数决方式通过修改出资 ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...