设计模式回顾:策略模式、代理模式、装饰者模式的区别

前言

设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性。设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具。

- 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他。

- 开放-封闭原则:软件实体(类、模块、函数等)应该可以扩展,但是不可修改。这一点是说,拒绝硬编码,拒绝直接修改原有代码。

- 依赖倒转原则:高层模块不应该以来低层模块。两个都应该以来抽象。抽象不应该依赖细节。细节应该依赖抽象。这一点是说,应该使用面向接口编程。

这些原则是程序员在协同工作中达成的共识,就算大家从来没有学习过什么设计模式,只要能遵循这些原则,也许你自己已经使用了某些设计模式。

有三个模式我以前学习的时候很混淆,他们是策略模式、代理模式、装饰者模式。混淆的原因是,这三个模式都是在 辅助类中持有一个目标类的对象,通过操作这个目标对象,完成实际任务。

在工作中具体场景下深入思考以后,我终于对他们有了进一步的理解。

首先来看策略模式,uml类图如下

策略模式通过将一些易变的计算抽象为策略实体,通过多态,让实际调用者尽可能的不用感知这种变化。

再看代理模式

代理模式与策略模式不同的是,代理类必须和被代理类具有相同的父类或接口,即代理类要么继承或实现被代理类的父类,要么直接计程被代理类本身。这两种情况分别对应java的jdk代理和cglib代理实现。

代理模式不是为了封装变化,而是为了隐藏实际执行者本身。

最后是装饰者模式

装饰者模式和策略模式的不同在于,原有类和装饰器类必须继承同一个父类。装饰器对象除了需要完成持有对象的操作外,还有一些附加操作,这些附加操作随着装饰器的不同而变化。持有对象本身的操作是主体,装饰器的操作是补充。而策略模式中,具体策略才是主体。

原文地址:https://www.cnblogs.com/lvsunshine21/p/10665179.html

时间: 2024-10-18 18:34:53

设计模式回顾:策略模式、代理模式、装饰者模式的区别的相关文章

设计模式(十):Decorator装饰者模式 -- 结构型模式

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

设计模式的征途—13.代理(Proxy)模式

所谓代购,简单说来就是找人帮忙购买所需要的商品.代购分为两种类型,一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价格比其他地区的贵,因此托人在其他地区甚至国外购买该商品,然后通过快递发货或直接携带回来.另一种则是消费者对想要购买的商品相关信息的缺乏,自己无法确定其实际价值,因此只好委托中介讲价或购买.在软件开发中,有一种设计模式可以提供与袋盖类似的功能,由于某些原因,客户端不想或者不能直接访问某个对象,此时可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式则被称为

静态代理和装饰者模式的区别

静态代理是一种编译期增强,还没运行就已经知道增强的目标对象. 装饰者是运行时增强,只有运行时才知道具体增强的目标. Code show time 静态代理: package com.zjt.test; interface Duck { void swim(); } class DuckImpl implements Duck{ @Override public void swim() { System.out.println("小鸭子会游泳"); } } class ProxyDuck

设计模式之美学习-结构型-装饰者模式(二十)

什么是装饰者模式 在不破坏被装饰类的业务逻辑的情况下进行增强 同时支持装饰多层,与代理模式很像 装饰者侧重增强,代理侧重控制 Java IO 类图 使用 //FileInputStream是转为用于读取文件流的类 InputStream in = new FileInputStream("/user/wangzheng/test.txt"); //是一个支持带缓存功能的数据读取类 对in进行装饰实现增加 带有缓存 InputStream bin = new BufferedInputS

设计模式: 自己手动写一个装饰者模式

装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供l比继承更有弹性的替代方案.装饰者和被装饰者有相同的超类型,你可以用一个或多个装饰者包装一个对象.既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被装饰者)的场合,可以用装饰过的对象替换它.装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,已达到特定的目的.对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰对象. 类图: 源代码如下: package decorator; /** *

设计模式:策略、代理、单例

一. 策略模式 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 先说这个场景中的要素:三个妙计,一个锦囊,一个赵云. 1)妙计:(一个接口,三个具体妙计) 1 package com.henry.strategy; 2 3 public interface IStrategy { 4 5 public void operate(); 6 7 } IStrategy.java 1 package com.henry.

javascript设计模式——装饰者模式

前面的话 在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责.那么可以使用装饰者模式.装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.本文将详细介绍装饰者模式 概念 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活,还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变:另一方面,继承这种功能复用方式通常被称为“白箱复用”,“白箱”是相对可见性而言的,在继承方式中,超类的

JavaScript设计模式与开发实践 装饰者模式

在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责.那么我们就可以使用装饰者模式.装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象. 装饰者模式能够在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责. 一.模拟传统面向对象语言的装饰者模式 假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第三级时可以发射原子弹. var

java代理模式与装饰者模式

静态代理和装饰者模式的区别: 先来看一下装饰者模式的定义:装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 总结一下采用装饰者模式是为了增强或拓展原对象的功能. 而静态代理除了能够提供功能增强外(AOP增加日志监控等,但不提供原对象本身的增强功能)还通常起到了控制访问的作用. 另外装饰者模式适用于递归组合. 看见百度静态代理和装饰者模式的区别出来前几个博客实在是无力吐槽,连装饰者模式其实就是动态代理模式都有人说的出来.. 相关连接: https://sta