设计模式再探——装饰模式

目录

一、背景介绍

最近公司在做架构模型的时候,涉及到装饰模式的研究,对于装饰模式的边界理解,本次有了看山还是山的效果,故做此总结以记录本次的升华。

二、思路&方案

  • 1.装饰模式简介
  • 2.装饰模式的类图
  • 3.装饰模式代码
  • 4.装饰模式,职责父类拆分的奥义
  • 5.装饰模式,部件抽象类的无中生有

三、过程

1.装饰模式简介

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

解释:给(ConcreteComponent)对象增加一些额外(Decorator的子类)职责;就给(ConcreteComponent)增加功能来说;通过生成(ConcreteComponent)子类的方式增加功能;装饰模式更为灵活(扩展装饰子类通过聚合方式装饰,耦合性更低)

2.装饰模式的类图

3.装饰模式代码

java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:43
 */
public class Client {
    public static void main(String[] args) {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteComponentA a = new ConcreteComponentA();
        ConcreteComponentB b = new ConcreteComponentB();

        a.setComponent(c);
        b.setComponent(a);
        b.Operation();
    }
}
java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:30
 */
public abstract class Component {
    public abstract void Operation();
}
java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:37
 */
public class ConcreteComponent extends Component{
    @Override
    public void Operation() {
        System.out.println("具体对象的操作");
    }
}
java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;


/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 11:43
 */
public class Decorator extends Component{
    protected Component component;

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

    public void setComponent(Component component) {
        this.component = component;
    }
}
java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:27
 */
public class ConcreteComponentA extends Decorator{
    private String addedState;

    @Override
    public void Operation() {
        super.Operation();
        addedState = "New State";
        System.out.println("具体装饰对象A");
    }
}
java 复制代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;

import com.a6UMLRelationShip.a3combination.a2.A;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/19 14:29
 */
public class ConcreteComponentB extends Decorator{

    @Override
    public void Operation() {
        super.Operation();
        AddedBehavior();
        System.out.println("具体装饰对象B");
    }

    private void AddedBehavior(){

    }
}

4.装饰模式,职责父类拆分的奥义

Decorator类是从ConcreteComponent中的装饰行为中抽象出来的类;从而使得后续扩展装饰符合开闭原则。

5.装饰模式,部件抽象类的无中生有

ConcreteComponent中的装饰行为的拆分,使得这些行为与被装饰者必须得从客户端产生关系;这也就对客户端暴露了业务;因而产生Component类。

四、总结

  • 1.无装饰模式情况下,将装饰方式当做被装饰者类中行为;这些行为对于被装饰者类而言不支持开闭原则。
  • 2.装饰行为在被装饰者中剥离之后,使得两个如何合并成为了眼前的问题。
  • 3.无中生有的做一个部件抽象类,又将两者做了部件类上的合并。
  • 4.技术上可以实现,业务上没有实现;这样的一种实现结果是否算是符合要求的? 将这条透明化的问题提出来也是进步的印证。

五、升华

该模式从技术角度通过剥离+无中生有父类的角度实现了扩展装饰符合开闭原则,并且对于客户端也没有对外暴露装饰过程的效果;在业务的角度是需要站到技术的基础之上去理解业务才会更加顺畅。

相关推荐
没有bug.的程序员6 分钟前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋31 分钟前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~1 小时前
《设计模式》装饰模式
java·设计模式
A尘埃1 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
鱼鱼说测试1 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
艾莉丝努力练剑2 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_022 小时前
【Java基础面试题】Java基础概念
java·开发语言