初探装饰器模式(代码片段)

yzdtofly yzdtofly     2022-12-26     712

关键词:

装饰器模式:动态地将责任附加到对象上,允许用户向现有对象添加新功能而不改变其结构。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。

场景:假如有这样一个抽象装备类

package pattern.decorator;

public abstract class Equipment 
    int power;//战斗力
    String desc = "";//介绍

    public String getDesc()
        return desc;
    

    //获取战斗力
    public abstract int getPower();

然后实现一个武器类继承上面的装备类

package pattern.decorator;

public class Weapon extends Equipment 

    public Weapon()
        desc = "屠龙宝刀";
        power = 1000000;
    

    @Override
    public int getPower() 
        return power;
    

一段时间后,装备增加了进阶,时装,强化等功能,这些功能都可以提升战斗力,现在希望计算提升后的战斗力。

先不管其他方法是怎么实现这个需求的,让我们来看看装饰器模式是怎么设计的,并且不会改变上面的Weapon类。

 

首先,设计一个装备的装饰器抽象类

package pattern.decorator;

public abstract class Decorator extends Equipment 
    //显示都装饰了什么
    public abstract String getDesc();

然后实现强化,进阶,时装的装饰类

强化(强化一次战力提升1000):

package pattern.decorator;

public class StrengthDecorator extends Decorator 

    Equipment equipment;//需要被装饰的装备
    int strength = 0;//强化了多少

    public StrengthDecorator(Equipment equipment,int strength)
        this.equipment = equipment;
        this.strength = strength;
    

    @Override
    public String getDesc() 
        return "强化了"+strength+"次"+","+equipment.getDesc();
    

    @Override
    public int getPower() 
        return equipment.getPower() + 1000*strength;
    

进阶(进阶一次战力提升2000):

package pattern.decorator;

public class AdvanceDecorator extends Decorator 

    Equipment equipment;//需要被装饰的装备
    int advance = 0;//进阶了多少

    public AdvanceDecorator(Equipment equipment, int advance)
        this.equipment = equipment;
        this.advance = advance;
    

    @Override
    public String getDesc() 
        return "进阶了"+advance+"次"+","+equipment.getDesc();
    

    @Override
    public int getPower() 
        return equipment.getPower() + 2000*advance;
    

时装(根据不同的时装提升战力):

package pattern.decorator;

public class FactionDecorator extends Decorator 

    Equipment equipment;//需要被装饰的装备
    String faction = "";//进阶了多少
    int add = 0;

    public FactionDecorator(Equipment equipment, int faction)
        this.equipment = equipment;
        if(faction==1)
            this.faction = "春节时装";
            add = 5000;
        else
            this.faction = "普通时装";
            add = 2500;
        
    

    @Override
    public String getDesc() 
        return faction+","+equipment.getDesc();
    

    @Override
    public int getPower() 
        return equipment.getPower() + add;
    

最后实现个测试类看看装饰器模式是怎么运作的


package pattern.decorator;

public class ShowController
public static void main(String[] args)
Equipment weapon = new Weapon();
System.out.println(weapon.getDesc()+",战力:"+weapon.getPower());
weapon = new AdvanceDecorator(weapon,10);
System.out.println(weapon.getDesc()+",战力:"+weapon.getPower());
weapon = new FactionDecorator(weapon,1);
System.out.println(weapon.getDesc()+",战力:"+weapon.getPower());
weapon = new StrengthDecorator(weapon,15);
System.out.println(weapon.getDesc()+",战力:"+weapon.getPower());

 

运行结果:

屠龙宝刀,战力:1000000
进阶了10次,屠龙宝刀,战力:1020000
春节时装,进阶了10次,屠龙宝刀,战力:1025000
强化了15次,春节时装,进阶了10次,屠龙宝刀,战力:1040000

















设计模式——十七:装饰器模式(代码片段)

@目录什么是装饰器模式?为什么要用装饰器模式使用装饰器模式前引入装饰器模式装饰器模式优缺点装饰器模式优点装饰器模式缺点装饰器模式应用场景扩展-Java中的装饰器模式什么是装饰器模式?装饰器模式的定义:Attachadditi... 查看详情

装饰器模式(代码片段)

一、模式名装饰者模式,Decorator二、解决的问题装饰者模式顾名思义,就是在原来的对象上加入一些修饰的部分,用以丰富原有对象的功能。但装饰器模式中的装饰器类和被装饰的对象保持一致,一般是继承或实现同一个父类或... 查看详情

装饰器模式(代码片段)

   装饰器模式,顾名思义,拘束将某个类重新装扮一下,使得它比原来更“漂亮”,或者在功能上更强大,这就是装饰器模式所要达到的目的。但是作为原来的这个类的使用者,还不应该感受到装饰前和装饰后又什么不同... 查看详情

装饰器模式(代码片段)

1介绍:1.1概念:装饰器模式允许向一个现有的对象添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,来包装原有的类,在保证方法签名完整的情况下,添加了额外的功能。1.2优缺点:   优点:装饰类... 查看详情

装饰器模式(代码片段)

1、引言最近在看Openstack源码,发现里面大量使用了装饰器模式,以前也接触过装饰器模式,只了解它是在原有对象上加了一层封装,保持原有逻辑不变。今天仔细想想,完全可以再重新写一个类,把原来的对象包进去,将原来... 查看详情

设计模式之装饰器模式(代码片段)

...请小王来帮忙,小王却想谋权篡位,老王通过教育他引出装饰器设计模式,第二部分针对老王提出的建设性意见实现装饰器模式,第三部分针对装饰器模式在Jdk中的IO、Spring中的缓存管理器、Mybatis的运用来加强我们的理解,第四... 查看详情

二十三种设计模式之装饰器模式(代码片段)

装饰器模式的定义与特点装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。装饰器模式的主要优点有:装饰器是继承的有力... 查看详情

java模式之装饰器模式(代码片段)

定义:装饰器模式也叫作包装器模式,只在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式装饰器模式提供了比... 查看详情

java模式之装饰器模式(代码片段)

定义:装饰器模式也叫作包装器模式,只在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式装饰器模式提供了比... 查看详情

结构篇-装饰器模式(代码片段)

文章目录一、从素面朝天到花容月貌1.展示行为2.女生类3.装饰器4.客户端类二、化妆品的多样性1.装饰器抽象类2.装饰器实现3.客户端类三、无处不在的装饰器总结装饰指在某物件上装点额外饰品的行为,以使其原本朴素的外... 查看详情

设计模式之装饰器模式(代码片段)

装饰器模式1.简要概述2.模式结构3.实现代码4.优点好处5.缺点弊端6.应用场景7.应用示例1.简要概述装饰器模式也叫作包装器模式,就是动态的为一个对象增加新的功能。装饰器模式是一种用于代替传统继承的技术,通过使... 查看详情

结构性设计模式之装饰器模式(代码片段)

@TOC装饰器模式概述实现原理主要角色装饰器模式主要包含4种角色1.抽象组件(Component)2.具体组件(ConcreteComponent)3.抽象装饰器(Decorator)4.具体装饰器(ConcreteDecorator)应用场景1.用于扩展一个类的功能或给一个类添加附加职责。2.动态的... 查看详情

设计模式之装饰器模式(代码片段)

  今天我们介绍的设计模式叫做装饰器模式,那么什么是装饰器模式,官方给出的解释为:装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。使用装饰器模式可以让我们在不使用继... 查看详情

c++装饰器模式的实现(代码片段)

装饰器模式-DecoratorPattern模式思想模式简介模式优点模式缺点代码实现情景模拟代码实现运行结果参考资料模式思想模式简介装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这... 查看详情

学习go语言之装饰器模式(代码片段)

一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征。二,定义对象接口和装饰抽象类1typeIDecorateinterface2Do()345//装... 查看详情

设计模式-装饰器模式(代码片段)

引言:一、概述 二、使用步骤实例:将把一个形状装饰上不同的颜色,同时又不改变形状类。 1.创建一个接口:图形packagecn.model;/***图形接口*/publicinterfaceShape/***画图*/voiddraw();ViewCode2.创建这个接口的实现类:矩形/圆形pac... 查看详情

设计模式之装饰器模式(代码片段)

1.之前的博客中说过Mybatis中的二级缓存(CachingExecutor为装饰器模式的实现),现在就来说一下装饰器模式。2.装饰器模式的作用:动态的为一个对象添加新的功能,以往我们要增加功能要不修改源代码,要不就是生成自类,非常不灵... 查看详情

java生成装饰器模式的结果集代码(代码片段)

查看详情