装饰模式

大话设计模式-装饰模式

孤街醉人 提交于 2019-12-20 14:06:46
装饰模式 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式结构演示 组件类:Component Component是定义一个对象接口,可以给这些对象动态地添加职责。 abstract class Component{ public abstract void Operation(); } 具体组件类:ConcreteComponent ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。 class ConcreteComponent : Component{ public override void Operation() => Console.WriteLine("具体对象的操作"); } 装饰抽象类:Decorator 继承了Component,从外类来扩展Component类的功能,但对于Component来说是无需知道Decorator的存在的。 abstract class Decorator:Component{ protected Component component; //设置组件 public void SetComponent(Component component) => this.component = component; //重写方法为调用组件的原方法 public

装饰模式

和自甴很熟 提交于 2019-12-20 07:17:12
【装饰模式】 : 动态的给一个对象添加一些额外的职责 ,就增加功能来说,装饰模式比生成子类更为灵活。 Component是定义一个对象接口,可以给这些对象动态的添加职责。 ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责。 Decorator装饰抽象类,继承了Component类, 从外类来扩展Component类的功能, 但对于Component来说,是无需知道Decorator类的存在的。至于ConcreteDecorator 就是具体的装饰对象,起到给Component添加职责的功能。 【优点】:把类中的装饰功能从类中搬移到类外,这样可以简化原有的类;能有效的把核心职责和装饰功能区分开,而且可以除去相关类中重复的逻辑。 【示例代码】 using System; //Component是定义一个对象接口,可以给这些对象动态的添加职责。 abstract class Componet { public abstract void Operation(); } // 具体要操作的对象,实现上面的Componet接口,将要添加的职责移到类外。 class ConcreteComponent : Componet { public override void Operation() { Console .WriteLine( "具体对象的操作" );

研磨设计模式之 装饰模式-4

☆樱花仙子☆ 提交于 2019-12-20 04:55:29
3.3 装饰模式和AOP 装饰模式和AOP在思想上有共同之处。可能有些朋友还不太了解AOP,下面先简单介绍一下AOP的基础知识。 1:什么是AOP——面向方面编程 AOP是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 在面向对象开发中,考虑系统的角度通常是纵向的,比如我们经常画出的如下的系统架构图,默认都是从上到下,上层依赖于下层,如图5所示: 图5 系统架构图示例图 而在每个模块内部呢?就拿大家都熟悉的三层架构来说,也是从上到下来考虑的,通常是表现层调用逻辑层,逻辑层调用数据层,如图6所示: 图6 三层架构示意图 慢慢的,越来越多的人发现,在各个模块之中,存在一些共性的功能,比如日志管理、事务管理等等,如图7所示: 图7 共性功能示意图 这个时候,在思考这些共性功能的时候,是从横向在思考问题,与通常面向对象的纵向思考角度不同,很明显,需要有新的解决方案,这个时候AOP站出来了。 AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。 AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。 AOP之所以强大,就是因为它能够自动把横切关注点的功能模块

c++设计模式之装饰模式

血红的双手。 提交于 2019-12-19 23:58:19
前言 装饰,顾名思义,就是对现有的物件进行优化,比如加一些好看的物件等等。例如拍出来的照片需要进行美化,刚建好的房子需要装修等等。在软件设计中,有时候也需要对现有的类进行“装饰”,以满足客户的要求。 装饰模式的定义 装饰模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰模式能够实现动态的为对象添加新的功能,并且是从类的外部来增加新的功能。如果从类的内部进行添加新的功能,就违反了设计模式的开闭原则。装饰模式就是把复杂的工作简单化,分散化。 装饰模式的结构 装饰模式的UML类图如下所示: 可以看到装饰模式的主要角色有以下几个: 1.抽象构件:定义一个抽象接口以规范准备接收附加责任的对象。 2.具体构件:实现抽象构件,通过装饰角色为其添加一些职责 3.抽象装饰:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 4.具体装饰:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。 装饰模式示例 接下来来看一下一个简单的实例吧。 示例简介:想必大家都知道绝地求生这款游戏吧,开局一条狗,啊呸,说顺口了,是开局一个人,要想活下来就必须捡装备来武装自己才能有能力对抗啊。 先构造一个抽象士兵类,起抽象构件角色 class AbSoldier //抽象士兵类 { public : virtual void

装饰模式(包装模式)

旧城冷巷雨未停 提交于 2019-12-19 04:22:04
模式动机 一般有两种方式可以实现给一个类或对象增加行为: • 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 • 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)。 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。 模式定义 装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。 模式结构 装饰模式包含如下角色: • Component : 抽象构件 • ConcreteComponent : 具体构件 • Decorator : 抽象装饰类 • ConcreteDecorator : 具体装饰类 模式分析

装饰者模式

社会主义新天地 提交于 2019-12-18 20:12:56
对于一个初学设计模式的人来说,装饰者模式是很头疼的,因为我们一般很少会在项目中使用到这种模式(或者是个人的喜好吧)。装饰者模式是为了更为灵活的扩展对象的方法。 一般情况下,我们要扩展一个对象的方法,我们会用到继承,或者将对象内聚进去。但是,继承的扩展相对来说是静止的扩展,就是说一个方法扩展后,如果想继续新增功能的话,必须再次继承,再次扩展方法。这样的扩展就很容易引起子类的膨胀。 我想引入一个例子,就是tlw旁边的莆田卤面(听说又涨价啦),莆田卤面的做法比较灵活,可以加入多种佐料。比如 花蛤、虾、海蛎、蛏、蘑菇、猪肉。卤面中可以加入一种或者几种佐料,很显然,如果要为卤面加佐料的话,根据单一职责,需要派生出21种来子类来(6+5+4+3+2+1)。这样一来,就会出现子类膨胀,难以维护,而且对于边际扩展来说,所需要派生出来的子类就更多了(如果有10种配料的话,需要的子类是10+9+8+...+2+1)。 而装饰者模式就是为了解决这个问题的。装饰者模式的意图就是: 动态地给一个对象添加一些额外的职责。 /// <summary> /// 面条 /// </summary> public class Noodles { } /// <summary> /// 佐料 /// </summary> public abstract class Condiments { /// <summary>

【转载】设计模式也可以这么简单

為{幸葍}努か 提交于 2019-12-18 05:43:23
一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的😂😂😂,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four ( GoF ) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文: 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不能说改就改;对扩展开放就比较好理解了,也就是说在我们写好的代码基础上,很容易实现扩展。 创建型模式比较简单,但是会比较没有意思,结构型和行为型比较有意思。 创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类

JAVA设计模式 之 装饰器模式

倾然丶 夕夏残阳落幕 提交于 2019-12-17 20:24:51
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 当我们想要扩展一个类,又由于继承类过多,工作量大,耦合度过高等原因纠结的时候,装饰器模式无疑是最好的选择。这种模式做到了装饰类和被装饰类相互独立发展,装饰类可以动态的添加功能,相比于维护庞大的功能不同的被装饰类类来说更灵活。这里举个简单的例子: 一个表演家Actor抽象类,具有表演的能力。 public abstract class Actor { /** * 表演 */ public abstract void act(); } 三个子类,舞蹈家DanceActor,演员MovieActor,歌唱家SingActor继承了表演家Actor: public class DanceActor extends Actor { @Override public void act() { System.out.println("跳舞"); } } public class MovieActor extends Actor { @Override public void act() { System.out.println("演电影"

view 视图函数

我的梦境 提交于 2019-12-17 11:06:51
一 Django的视图函数view      一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。   响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。   无论视图本身包含什么逻辑,都要返回响应。 代码写在哪里也无所谓,只要它在你当前项目目录下面。 除此之外没有更多的要求了——可以说“没有什么神奇的地方”。 为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为 views.py 的文件中。   一个简单的视图   下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)   让我们来逐行解释下上面的代码: 首先,我们从 django.http 模块导入了 HttpResponse 类,以及Python的 datetime 库。 接着,我们定义了

装饰者模式

删除回忆录丶 提交于 2019-12-17 10:22:43
装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 设计原则: 1. 多用组合,少用继承。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 2. 类应设计的对扩展开放,对修改关闭。 要点: 1. 装饰者和被装饰对象有相同的超类型。 2. 可以用一个或多个装饰者包装一个对象。 3. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。 4. 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。 5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。 6. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。 7. 适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。 实现: Component: 定义一个对象接口,可以给这些对象动态地添加职责。 public