装饰者模式(附与代理模式的区别,乍看挺像)

2024-06-19 09:48

本文主要是介绍装饰者模式(附与代理模式的区别,乍看挺像),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.装饰模式介绍

装饰模式也称为包装模式,结构设计模式之一,就像房子一个,房子盖好都是毛坯房,但是装修之后,有简单装修,精装修,豪华装修,各有不同,这个就可以理解为装饰模式,不管你怎么装修,最开始都是毛坯房,或者一个人每天穿不同的衣服(装饰),但是本质还是同一个人没有发生改变

 

二.装饰模式的定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类而言更加简单

 

三.装饰模式的使用场景

需要透明并且动态的扩展类的功能时。

 

四.简单实现

//Component.java

public abstract class Component {/*** 抽象的方法* */public abstract void operate();
}


//ConcreteComponent.java

public class ConcreteComponent extends  Component {@Overridepublic void operate() {System.out.println("xcqw 我是小明");}
}

//Decorator.java

public abstract class Decorator extends Component {private Component component;//持有一个Component对象的引用/*** 必要的构造方法  需要一个Component类型的对象* */public Decorator(Component component) {this.component = component;}@Overridepublic void operate() {component.operate();}
}


//ConcreteDecoratorA.java
public class ConcreteDecoratorA extends Decorator {/*** 必要的构造方法  需要一个Component类型的对象** @param component*/public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operate() {//装饰方法A和B  (也就是带了个帽子 ,穿了双跑鞋)super.operate();}public void operateA(){//装饰方法逻辑System.out.println("我戴了帽子");}public void operateB(){//装饰方法逻辑System.out.println("我穿了双跑鞋");}
}


 //ConcreteDecoratorB

public class ConcreteDecoratorB extends Decorator {/*** 必要的构造方法  需要一个Component类型的对象** @param component*/public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operate() {//装饰方法A和B  (也就是带了个大金链子 ,穿了木屐)super.operate();}public void operateA(){//装饰方法逻辑System.out.println("我带了个大金链子");}public void operateB(){//装饰方法逻辑System.out.println("我穿了木屐");}
}

//MainActivity.java

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//构造被装饰的组件对象Component component = new ConcreteComponent();//根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的方法Decorator decoratorA = new ConcreteDecoratorA(component);decoratorA.operate();//根据组件对象构造装饰者对象B并调用,此时相当于给组件对象增加装饰者B的方法Decorator decoratorB = new ConcreteDecoratorB(component);decoratorB.operate();}
}

 

结果可以看到  一个是戴帽子穿跑鞋的小明,一个则是代金链子,穿木屐的小明,着装风格不一样,但是都是小明

 

Component:抽象组件

可以是一个接口或者抽象类,其充当的就是被装饰的原始对象

 

ConcreteComponent:组件具体实现类

该类是Component类的基本实现,也就是我们装饰的具体对象(也就是小明

 

Decorator:抽象装饰者

装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。

 

ConcreteDecorateA:装饰着具体实现类

只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修

 

ConcreteDecorateB:装饰着具体实现类

只是对抽象装饰着作出具体的实现(具体扩展的方法,精装修还是豪华装修

 

Client :客户类

 

 

五.Android源码中的模式实现



在Android中常用的Context就使用了装饰者模式,看图就很清晰了




六.跟代理模式的区别

一句话,装饰者模式是增强对象功能(穿不同的衣服),代理模式是控制代理的对象,但不对其做功能增加

这篇关于装饰者模式(附与代理模式的区别,乍看挺像)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074689

相关文章

hevc和H.264格式的区别

HEVC(High Efficiency Video Coding)和H.264(也称为Advanced Video Coding,AVC)都是视频压缩标准,但它们之间存在一些显著的区别,主要集中在压缩效率、资源需求和兼容性方面。 压缩效率 HEVC,也被称为H.265,提供了比H.264更高的压缩效率。这意味着在相同的视频质量下,HEVC能够以大约一半的比特率进行编码,从而减少存储空间需求和

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

flask 中使用 装饰器

因为要完成毕业设计,我用到fountain code做数据恢复。 于是在github上下载了fountain code的python原代码。 github上的作者用flask做了fountain code的demo。 flask是面向python的一个网站框架。 里面有用到装饰器。 今天笔试的时候,我也被问到了python的装饰器。

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

QT 中ListView和ListWidget有什么区别

ListView和ListWidget在Qt框架中都是用于显示列表数据的控件,但它们在使用方法和特性上存在一些明显的差异。以下是关于它们用法不一样的地方的详细分析: 数据管理方式: ListView:使用QAbstractItemModel数据模型来管理和显示列表数据。QAbstractItemModel是一个抽象类,允许开发者自定义数据模型以适应特定的数据结构和需求。这使得ListView在处

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle