首页 > 其他分享 >设计模式

设计模式

时间:2023-01-05 14:31:28浏览次数:37  
标签:装修 装饰 decorator 设计模式 public IDecorator decorate

一、装饰器模式

1.基本概念和功能

装饰器模式能够实现从一个对象的外部来给对象添加功能,有非常灵活的扩展性,可以在对原来的代码毫无修改的前提下,为对象添加新功能。除此之外,装饰器模式还能够实现对象的动态组合,借此我们可以很灵活地给动态组合的对象,匹配所需要的功能。

设计模式_设计模式

适用场景

  • 适合需要(通过配置,如:diamond)来动态增减对象功能的场景。
  • 适合一个对象需要N种功能排列组合的场景(如果用继承,会使子类数量爆炸式增长)


2.举例分析

假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、设计吊顶装饰房顶等未必是所有用户都需要的,这些功能则需要实现动态添加。还有就是一旦有新的装修功能,我们也可以实现动态添加。

1.接口定义:去定义具体需要实现的相关方法

/**
* 描述:定义一个基本装修接口
*
* @author yanfengzhang
* @date 2020-04-19 13:32
*/
public interface IDecorator {
/**
* 装修方法
*/
void decorate();
}

2.具体对象:针对需要实现的方法做初始化操作,即基本的实现

/**
* 描述:装修基本类
*
* @author yanfengzhang
* @date 2020-04-19 13:32
*/
public class Decorator implements IDecorator {
/**
* 基本实现方法
*/
@Override
public void decorate() {
System.out.println("水电装修、天花板以及粉刷墙.");
}
}

3.装饰类:抽象类,初始化具体对象

/**
* 描述:基本装饰类
*
* @author yanfengzhang
* @date 2020-04-19 13:34
*/
public abstract class BaseDecorator implements IDecorator {
private IDecorator decorator;

public BaseDecorator(IDecorator decorator) {
this.decorator = decorator;
}

/**
* 调用装饰方法
*/
@Override
public void decorate() {
if (decorator != null) {
decorator.decorate();
}
}
}

4.其他具体装饰类实现自己特性的需求

如果我们想要在基础类上添加新的装修功能,只需要基于抽象类 BaseDecorator 去实现继承类,通过构造函数调用父类,以及重写装修方法实现装修窗帘的功能即可。

/**
* 描述:窗帘装饰类
*
* @author yanfengzhang
* @date 2020-04-19 13:35
*/
public class CurtainDecorator extends BaseDecorator {
public CurtainDecorator(IDecorator decorator) {
super(decorator);
}

/**
* 窗帘具体装饰方法
*/
@Override
public void decorate() {
System.out.println("窗帘装饰。。。");
super.decorate();
}
}

5.实际使用

/**
* 描述:具体使用测试
*
* @author yanfengzhang
* @date 2020-04-19 13:36
*/
public class Test {
public static void main(String[] args) {
IDecorator decorator = new Decorator();
IDecorator curtainDecorator = new CurtainDecorator(decorator);
curtainDecorator.decorate();
}
}


标签:装修,装饰,decorator,设计模式,public,IDecorator,decorate
From: https://blog.51cto.com/u_15709549/5991099

相关文章

  • 设计模式-单例模式
     时间:2023/01/04 一.单例模式介绍作用:所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对......
  • 设计模式简单介绍
    注:所有知识来源于《设计模式:可复用软件面向对象的基础》1什么是设计模式ChristopherAlexander说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解......
  • 设计模式之开闭原则
    面向对象程序应该对扩展开放,对更改封闭。如果更改代码,要重新编译,重新测试,重新部署,会附带很多其他操作。python可以使用鸭子模式,进行多态调用。如下,a和b可以独立变化,不......
  • 重学 Java 设计模式-结构型模式-适配器模式
    重学Java设计模式-结构型模式-适配器模式内容摘自:添加链接描述适配器模式介绍图片来自:https://refactoringguru.cn/design-patterns/adapter(opensnewwindow)适......
  • python设计模式
    设计模式设计模式中使用了一个接口类abc:AbstractBaseClasses作用:在代码中定义和使用抽象基类进行API检查。​为什么使用abc模块Abstractbaseclasses由一组接口组......
  • 使用Qt和Interpreter设计模式开发计算器(附源码)
    计算器软件其实有很多种,但是基本上都是模仿计算器,用鼠标点击按键来操作,这次我们反其道而行之,采用类似文本输入的操作方式。功能1.键盘输入算式,回车后计算结果。2.根据当前......
  • 常用设计模式之简单工厂模式
    简单工厂模式(C++)工厂模式的使用场景也比较多,像是一些组件对象的创建场景,这里说一下简单工厂模式。特点及应用1.特点(1)封装具体实现,只提供管理对象接口举个例子:我......
  • HeadFirst设计模式之观察者模式学习
    一、观察者模式的定义:观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者,都会收到通知并自动更新。 二、我个人对于观察者模式的理解:当主题发生改变......
  • Alan Ezust-C++设计模式(基于Qt)-UMLChina讲座-音频和幻灯
    时间2008年7月15日(周二)上午10:00-12:00演讲人AlanEzust。《C++设计模式--基于Qt4开源跨平台开发框架》作者,曾在McGill大学、Suffolk大学以及Leamix、Nertel、Objectivity、......
  • 技术书籍也香艳-时隔12年《Head First设计模式》第二版要来了
    “技术书籍也香艳”,时隔12年《HeadFirst设计模式》第二版要来了,中译本将由UMLChina翻译。十几年前,这本书采用“小姐姐提神”(抖音?)的方式开启了一波HeadFirst流。很遗憾,第二......