装饰模式

设计模式-装饰模式

一世执手 提交于 2020-03-07 21:03:03
装饰模式 这里只讲一些理论上的东西,实现将会在接下来几篇文章具体展开,有兴趣,可以一起研究讨论吖!!!下面进入正题。 定义: 动态地给对象添加一些额外的功能且不改变其结构 。就增加功能这一点,装饰模式要比增加子类灵活。 接下来看下装饰模式的结构图: 模块大概代码如下: # include <cstdio> # include <cstdlib> # include <ctime> # include <string> # include <iostream> # include <algorithm> using namespace std ; class component { public : virtual void Operation ( ) = 0 ; } ; class ConcreteComponent : public component { public : virtual void Operation ( ) { cout << "具体操作的对象" << endl ; } } ; class Decorate : public component { protected : component * Component ; public : void SetComponent ( component * component ) { this - >

设计模式 一一一 装饰模式

拟墨画扇 提交于 2020-03-07 11:43:49
适配器模式: 目的:适配器暴露符合外界规范的接口,该接口的具体实现通过调用被适配对象的相应方法来完成。 应用:系统需要使用现有的一个类,但是这个类的接口不符合系统的需要,此时就需要新增一个适配器来解决这个问题。 角色: 目标接口:符合外界规范的接口 源对象(被适配的对象):提供相应的功能,但是接口的规范不符合外界的要求 适配器:暴露符合外界规范的接口,通过调用被适配对象的相应方法,然后对其结果进行一定加工来实现。 jdk中的适配器模式: /** * 目标接口:Reader。 * 说明:Reader的目标是读取数据,但是只能按照字符来读取。 * 源对象(被适配的对象):InputStream的子类 * 说明:InputStream可以读数据,但是只能按字节来读取 * 适配器:InputStreamReader * 说明:InputStreamReader通过InputStream来读取数据,并且将读取到的字节流转换为字符流,然后提供给Reader进行读取。 */ public class InputStreamReader extends Reader { // StreamDecoder里面封装了InputStream对象,即InputStreamReader间接地封装了InputStream对象。 private final StreamDecoder sd; /** *

设计模式之装饰模式学习

强颜欢笑 提交于 2020-03-05 13:24:07
什么是装饰模式 装饰模式(Dec orator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。也就是说动态的给一个对象添加功能。 装饰模式的角色和职责 1、抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口。 2、具体组件角色:为抽象组件的实现类。 3、抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。 4、具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。 装饰模式的实现 以汽车为例,创建一个Car(抽象组件接口)以及MainClass public interface Car { //用来展示功能 public void show ( ) ; } 实现Car接口,并给与跑的功能(具体组件角色) public class RunCar implements Car { //跑功能 public void run ( ) { System . out . println ( "可以跑的很快。" ) ; } @Override public void show ( ) { this . run ( ) ; } } 在main类运行结果中,只能跑。 现在需要也能水里面开,那就要创建一个抽象装饰角色了。 public abstract class CarDecorator implements Car { /

6.11 装饰器设计模式

柔情痞子 提交于 2020-03-04 06:01:32
装饰器设计模式 装饰四大部分 代码示例 装饰四大部分 1、抽象组件:需要装饰的抽象对象(接口或抽象父类) 2、具体组件:需要装饰的对象 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法 4、具体装饰类:被装饰的对象 代码示例 code /** * 测试装饰, 模拟将人的声音放大 * 装饰四大部分 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类) (Say) * 2、具体组件:需要装饰的对象 (Person) * 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法 * 4、具体装饰类:被装饰的对象 (Person) * @author dxt * */ public class DecorateTest01 { public static void main ( String [ ] args ) { Say p = new Person ( ) ; p . say ( ) ; Say p2 = new Louder ( p ) ; p2 . say ( ) ; } } //抽象组件: interface Say { void say ( ) ; } //具体接口 class Person implements Say { private int voice = 10 ; public int getVoice ( ) { return this .

Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

随声附和 提交于 2020-03-04 04:05:02
1. 概述 :   我们在前面用了很多的装饰器这个工具的方法。这个位置要系统的讲一下装饰器。   1.2 为什么需要装饰器。   装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重要。   概括的讲,装饰器的作用就是为已经存在的函数或端详添加额外的功能。 2.装饰器的分类 :   装饰器分自定义装饰器、内置装饰器、调用第三方模块的装饰器和多层装饰器和嵌套装饰器。    2.1 自定义装饰器 :   请参照连接,第七部分的内容:https://www.cnblogs.com/noah0532/p/10817496.html    2.2 内置装饰器 :   内置装饰器和自定义装饰器原理是一样的,不过返回的不是函数,而是类对象。其中关于@staticmethod,@classmethod,@property,@setter这四种方法在前面已经经过了,参照连接:https://www.cnblogs.com/noah0532/p/10926966.html。还有一些内置装饰器在文章的后面会补充进来。    2.3

装饰模式

霸气de小男生 提交于 2020-03-03 21:45:27
1.什么是装饰模式 装饰器模式 :也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下: Component为统一接口,也是装饰类和被装饰类的基本类型。 ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。 Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。 ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。 2. 装饰模式案例 //房屋基础接口 public interface House { void run ( ) ; } public class HouseImpl implements House { @Override public void run ( ) { System . out . println ( "毛坯房子..." ) ; } } //房屋装饰类 public class HouseDecorate

Python-装饰器;Decorator模式

…衆ロ難τιáo~ 提交于 2020-03-01 11:36:49
直接转载一篇吧,够详细。具体的链接没有留下来…. 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc () : print( "myfunc() called." ) myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 # -*- coding:gbk -*- '''示例2: 替换函数(装饰) 装饰函数的参数是被装饰的函数对象,返回原函数对象 装饰的实质语句: myfunc = deco(myfunc)''' def deco (func) : print( "before myfunc() called." ) func() print( " after myfunc() called." ) return func def myfunc () : print( " myfunc() called." ) myfunc = deco(myfunc) myfunc() myfunc() 第三步:使用语法糖@来装饰函数 # -*- coding:gbk -*- '''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”

Java IO 流 设计模式

不想你离开。 提交于 2020-03-01 09:53:25
学过装饰模式后,大家会发现,它在Java语言中最著名的应用莫过于Java I/O标准为库的设计了。这一节将以处理Byte流为例,看看装饰模式是怎样得到应用的。   为什么不用继承而用装饰模式  我们知道Java I/O库需要很多性能的各种组合,如果说这些性能的组合是通过继承方式来实现的话,那么每一种组合都需要一个类,这样就会出现大量重复性问题的出现,从而使类数目“爆炸”。而如果采用装饰模式,那么不仅类的数目大减少了,性能的重复也可以减至到最少。所以装饰模式是Java I/O库的基本模式。在这里我想再用<<Head First Design Pattern>>中讲到装饰模式时候的一个例子,看看装饰模式是怎么达到不仅类的数目大减少了,性能的重复也可以减至到最少:  它这个例子大概是说:Beverage是一个抽象类,它被所有在一个咖啡店里卖的饮料继承。Beverage有个抽象方法cost,所有的子类都要实现这个抽象方法,计算它们的价格。现在有四个最基本的咖啡:HouseBlend,DarkRoast,Decaf,Espresso他们都继承自Beverage,现在的需求是说在四个最基本的咖啡里,每个都可以随便地添加调味品,像steamed milk,soy,还有mocha最后是加上whipped milk。如果是说按继承来实现这种几个调味品跟原来咖啡的组合的话

设计模式之(装饰模式)待续。。。

天大地大妈咪最大 提交于 2020-03-01 06:56:03
component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象,如上面的成绩单。 注意:在装饰模式中,必须有一个从最基本、最核心、最原始的接口或者抽象类充当Component抽象构件。 concreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。 Decorator装饰角色 ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西,上面的例子就是把一个比较平庸的成绩单装饰成家长认可的成绩单。 使用场景: 需要扩展一个类的功能,或给一个类增加附加功能。 需要动态的给一个对象增加功能,这些功能可以I动态的撤销。 需要为一批的兄弟类进行改装或加装功能,当让是首选装饰模式。 代码及类图后续补上。。。 来源: CSDN 作者: 焱墩 链接: https://blog.csdn.net/yang1076180972/article/details/104580892

C++设计模式之装饰器模式

吃可爱长大的小学妹 提交于 2020-03-01 03:10:22
装饰器模式(DECRATOR): 为了实现动态的给对象添加职能,即从外部给对象添加相关职能。可以这样理解,比如说一个Person类,该类的操作有能吃、能睡、能跑、但假如随着人类的进化,某一天Person能飞了,能在水里游了等等,按照一般的写法是修改Person这个类,给这个类添加上能飞,能游等操作,但是这样破坏了面向对象的开放-封闭原则(对修改封闭,对拓展开发,有兴趣的可以查看相关文献),且随着人类的进化这个类就会变得越来越臃肿,越来越复杂,添加任何一个功能都必须对这个臃肿的类进行修改,出错的概率大大提升,且容易影响老功能,而装饰器模式可以解决这类问题,装饰器从外部给类添加职能,而不用去修改原始的类,拓展性好,可复用程度高。 在装饰模式中的各个角色有: 抽象构件(Component)角色 :,装饰器和具体需要被装饰的对象都继承自该抽象对象,最重要的一点是Decrator维护了一个需要被装饰的对象的引用,从而达到为该对象添加职能的目的。 具体构件(Concrete Component)角色 :定义一个将要接收附加责任的类。 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。 具体装饰(Concrete Decorator)角色 :负责给构件对象"贴上"附加的责任。 考虑如下的例子:为一个蛋糕添加装饰