smile908

导航

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

首先我们来看一下装饰者模式的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种设计模式本来就是软件开发设计历年来优秀的程序员的结晶,常用的设计模式,比如工厂,策略,代理,包装,模板,装饰,监听者等模式

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

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

 

posted on 2022-08-29 11:17  smile908  阅读(316)  评论(0编辑  收藏  举报