html5导航网站源码,苏州建网站制作费用多少钱,做网站公司赚不赚钱,凡科网站做的好不好一、什么是装饰器模式 装饰器模式#xff08;Decorator Pattern#xff09;是一种结构型设计模式#xff0c;它的核心思想是在不改变原有对象结构的情况下#xff0c;动态地给对象增加一些功能#xff0c;从而达到扩展功能的目的。举个例子#xff0c;今天在家妈妈给蒸馒…一、什么是装饰器模式 装饰器模式Decorator Pattern是一种结构型设计模式它的核心思想是在不改变原有对象结构的情况下动态地给对象增加一些功能从而达到扩展功能的目的。举个例子今天在家妈妈给蒸馒头。馒头蒸的过程中妈妈去收拾衣服了。突然想起来馒头好了就跟你说“帮我把馒头拿出来。”这个时候馒头特别烫如果不烫其实用我们的手是可以拿出来的但是这个时候光用手拿不行。所以我们想了个办法找了一个手套从而把馒头拿了出来。这个过程就类似于装饰器模式手套相当于装饰器给手原有对象增加了隔热的功能使得手能够处理原本无法直接处理的烫馒头。
二、为什么使用装饰器模式 基于上面的馒头场景我们讨论一下为什么使用装饰器模式为什么要戴手套 动态扩展撤销功能当需要在运行时为对象动态添加功能时装饰器模式是一个很好的选择。例如比如应对热馒头去拿的时候要隔热功能不想隔热还可以直接上手。但是装饰的多了手不热吗手不累吗所示要适当添加。别为了拿馒头装了一堆东西反而得不偿失。 避免子类爆炸如果通过继承来扩展功能可能会导致子类数量急剧增加使得系统变得复杂且难以维护。装饰器模式可以避免这种情况通过组合的方式动态添加功能继承关系的替代。 保持原有接口不变装饰器模式可以在不改变原有对象接口的情况下增加新的功能这使得客户端代码可以透明地使用被装饰的对象而不需要修改客户端代码。拿馒头的手拿的功能不变
三、装饰器模式示例 Component抽象组件定义了被装饰对象的接口所有具体的组件和装饰器都实现这个接口。 //我就是一个手人们定义我叫手收能拿东西
public interface Hand {void pickUp(Object object) throws Exception;
} ConcreteComponent具体组件实现了Component接口的具体组件是被装饰的对象。 //我是一个赤裸裸真是长在身上的手人们说手可以拿东西我也可以
public class BareHand implements Hand {Overridepublic void pickUp(Object object) throws Exception {if (object instanceof HotBun) {throw new Exception(我擦太热了!);}System.out.println(Picked up object.getClass().getSimpleName() with bare hands.);}
} Decorator装饰器抽象类也实现了Component接口持有一个Component对象的引用通过组合的方式动态地为Component对象添加新的功能。 //其实手上没准可以加点东西
public abstract class HandDecorator implements Hand {protected Hand hand;public HandDecorator(Hand hand) {this.hand hand;}Overridepublic void pickUp(Object object) throws Exception {hand.pickUp(object);}
} ConcreteDecorator具体装饰器实现了Decorator的具体装饰器负责给Component对象添加具体的装饰功能。 //我是手套
public class GloveDecorator extends HandDecorator {public GloveDecorator(Hand hand) {super(hand);}Overridepublic void pickUp(Object object) throws Exception {System.out.println(戴上手套去拿 object.getClass().getSimpleName());hand.pickUp(object);}
} 客户端 //我是一个热馒头
public class HotBun {// 烫馒头的具体实现
} public class Main {public static void main(String[] args) {Hand bareHand new BareHand();try {bareHand.pickUp(new HotBun());} catch (Exception e) {System.out.println(e.getMessage());}// 使用手套装饰手Hand glovedHand new GloveDecorator(bareHand);try {glovedHand.pickUp(new HotBun());} catch (Exception e) {System.out.println(e.getMessage());}}
}//输出
我擦太热了!
戴上手套去拿热馒头
我擦太热了!