首页 > 其他分享 >设计模式-装饰者模式(Decorate)

设计模式-装饰者模式(Decorate)

时间:2022-08-29 11:24:53浏览次数:60  
标签:String class addDecorate 装饰 Role Decorate role 设计模式 public

首先我们来看一下装饰者模式的UML图

 

图中各个类的含义不懂没有关系,下面我会用一个形象的例子来一一介绍他们,相信大家看完后肯定就明白了

 

 比如,我们玩了一款游戏,里面有五种角色,分别是上路,打野,法师,射手和辅助,每个角色都有自己不同属性和方法,这里我们

为了通俗易懂,就来不同角色的衣服(黑色衣服,蓝色衣服,绿色衣服),头发(紫色头发,红色头发,黄色头发),裤子(灰色裤子,绿色裤子,白色裤子)

我们用这三种来修饰我们的角色,我们一起来算算一共有多少种可能性,当然是5*3*3*3,一共是135种搭配方案,我们总不可能写135个类吧,当然实际上的搭配肯定不止这么多

可能还有武器,技能,装备等等,这样算的话搭配的数量就可能达到几千种。在这种情况下,设计模式中的装饰者模式应运而生,接下来,我们一起来看看装饰者模式

的具体实现吧!

那么这个角色肯定是一个接口,这就是UML图中的Conponent接口

public interface Role {
String addDecorate();
}

在这个接口里面,我们定义了一个方法。返回值是一个String。接下来我们的五种职业来实现这个接口,接下来我们看具体实现。
public class Assist implements Role {
@Override
public String addDecorate() {
return "辅助";
}
}
public class Gungle implements Role {
@Override
public String addDecorate() {
return "打野";
}
}
public class Master implements Role {
@Override
public String addDecorate() {
return "法师";
}
}
public class Shooter implements Role {
@Override
public String addDecorate() {
return "射手";
}
}
public class Solder implements Role {
@Override
public String addDecorate() {
return "上路";
}
}

这五种角色的都实现了Role接口,实现了接口的addDecorate()方法。接下来我们写他设计了一个类,
实现了Role接口,并且传入了一个Role对象,这就对应UML图中的Decorator。
public class RoleDecorator implements Role {
private Role role;

public RoleDecorator(Role role) {
this.role = role;
}

@Override
public String addDecorate() {
return role.addDecorate();
}
}

我们看到他里面持有一个Role类型的对象,在addDecorate方法中实际调用的也是role的addDecorate对象,我们传入的Role对象也就是我们需要进行装饰的对象了。
接下来我们看装饰类都代码。每一种我们举一种例子。
public class BlackChothes extends RoleDecorator {
public BlackChothes(Role role) {
super(role);
}

@Override
public String addDecorate() {
return super.addDecorate()+"+黑色衣服";
}
}

public class PurpleHair extends RoleDecorator {

public PurpleHair(Role role) {
super(role);
}

@Override
public String addDecorate() {
return super.addDecorate()+"+紫色头发";
}
}

public class WhitePants extends RoleDecorator {

public WhitePants(Role role) {
super(role);
}

@Override
public String addDecorate() {
return super.addDecorate()+"+白色裤子";
}
}

其他的具体装饰我们自己去设计,在这里我们每一样只设计了一种,这样的话我们的装饰者模式大致就完成了。来我们看一下测试类。
public class Test {
public static void main(String[] args) {
Role role=new RedHair(new BlueChothes(new GreenPants(new Assist())));
Role role1=new PurpleHair(new WhitePants(new BlackChothes(new Shooter())));
System.out.println(role.addDecorate());
System.out.println(role1.addDecorate());
}
}
运行结果如下,没有什么大问题

 

总结:

23种设计模式本来就是软件开发设计历年来优秀的程序员的结晶,常用的设计模式,比如工厂,策略,代理,包装,模板,装饰,监听者等模式

作为一个开发者我们很有必要去理解这个思想,运用于我们的具体实践中。实现高内聚低耦合的代码设计,这次的装饰模式对角色进行了装饰,一般

的实现可能要几百个类去排列组合实现功能,而装饰者模式将这些小的装饰独立出来,每个角色都可以去应用,大大的降低了代码的耦合性。

 

标签:String,class,addDecorate,装饰,Role,Decorate,role,设计模式,public
From: https://www.cnblogs.com/smile908/p/16635270.html

相关文章

  • 设计模式之(3)——抽象工厂方法模式
    定义:抽象工厂模式简单地讲,就是提供一个超级工厂,围绕这个超级工厂创建其他工厂;抽象工厂模式提供一个创建一些列相关或者相互依赖对象的接口;在此之前我们先来讲一下产品......
  • 学习设计模式和画图
    目录参考参考使用keynote画图https://www.yrunz.com/p/用keynote画出手绘风格的配图/使用plantuml进行设计......
  • 9.设计模式-原型模式
    1.单例模式1.饿汉式packagecom.serlyf.singleton;/***单例模式-饿汉式*1.构造私有*2.本类创建静态示例*3.getInstance()方法公开*/publicclassSingl......
  • 设计模式-建造者模式
    //1.定义产品//2.抽象构造者,定义抽象方法//3.具体建造者,生产具体的建造方法//4.指挥者,负责生产具体的产品packagecom.serlyf.builder;//产品publicclassHouse......
  • 尚硅谷-设计模式篇
    ​ 只学了点理论概念,没有实操代码,感觉无论是项目架构、代码设计,还是团队人员管理,其实都是设计模式的具体落地实现。https://www.bilibili.com/video/BV1G4411c7N4?p=149&......
  • python基础__装饰器(修饰器)
    装饰器处理逻辑当解释器读到@装饰符,会先解析@下一行的内容,把下一行的函数或者类作为@后边的函数的参数,执行被装饰的函数。例子1:被修饰函数不带参数1deflog(func):......
  • 常见的设计模式-单例模式
    简述实现了类在当前进程中只有一个实例,比如python-GC重写__new__实现单例classA:def__new__(cls,*args,**kwargs):ifnothasattr(cls,'_instance......
  • 设计模式之工厂模式
    packagecn.com.pep.model.simpleFactory;/***@Title:CheesePizza*@Description:*@authorwwh*@date2022-8-2214:22:53*/publicclassCheesePiz......
  • 初识设计模式 - 单例模式
    简介一个类只允许创建一个对象(或实例),那么这个类就是一个单例类,这种设计模式称作单例设计模式(SingletonDesignPattern),简称单例模式。单例模式保证系统内存中只存在一个......
  • python基础——闭包 装饰器
    闭包函数嵌套,即外部函数嵌套一个内部函数;外部函数返回内部函数引用;内部函数使用外部函数的变量或者形参#简单演示#deff1(x):##deff2():#prin......