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

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

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor