装饰者模式
动态的给一些对象添加一些职能,就增加功能来说,装饰者比生成子类更灵活。
模型图
代码
public abstract class Component {
public abstract void Operation();
}
public class ConcreteComponet extends Component {
@Override
public void Operation() {
System.out.println("汉库");
}
}
public abstract class Decorator extends Component{
protected Component component=null;
public Decorator(Component component) {
this.component=component;
}
@Override
public abstract void Operation();
}
public class ConcreateDecoratorA extends Decorator{
public ConcreateDecoratorA(Component component) {
super(component);
// TODO Auto-generated constructor stub
}
@Override
public void Operation() {
this.component.Operation();
System.out.println("穿衣服");
}
}
public class ConcreateDecoratorB extends Decorator {
public ConcreateDecoratorB(Component component) {
super(component);
}
@Override
public void Operation() {
this.component.Operation();
System.out.println("穿库子");
}
}
public class Test {
public static void main(String[] args) {
Component component=new ConcreteComponet();
component=new ConcreateDecoratorB(component);
component=new ConcreateDecoratorA(component);
component.Operation();
}
}
运行结果
案例设计
需求:假设我们在制作一款RPG游戏,然后要创建一个角色Soul_Artist,这个时候我们就会设计到打装备。打到的装备要经常配置到我的身上,提升技能。然而又不能不穿汉库。就此请设计一个程序来完成这样的需求。
分析:核心是人穿衣服,重点核心是必须穿汉库,其他的可以不断的添加更多的衣服,并且可以灵活的进行装备的装与卸,综上所述的所有描述。分析可以使用装饰者模式。
模型图
代码
public abstract class Person {
public abstract String showDress();
}
public class SoulArtist extends Person{
@Override
public String showDress() {
return "汉库";
}
}
public abstract class DecoratorPerson extends Person{
protected Person person=null;
public DecoratorPerson(Person person) {
this.person=person;
}
@Override
public abstract String showDress();
}
public class DecoratorShortDress extends DecoratorPerson {
public DecoratorShortDress(Person person) {
super(person);
}
@Override
public String showDress() {
return this.person.showDress()+":"+"鞋";
}
}
public class DecoratorTshirtDress extends DecoratorPerson{
public DecoratorTshirtDress(Person person) {
super(person);
}
@Override
public String showDress() {
return this.person.showDress()+":"+"T-恤";
}
}
public class Test {
public static void main(String[] args) {
Person person=new SoulArtist();
person=new DecoratorShortDress(person);
person=new DecoratorTshirtDress(person);
String showDress = person.showDress();
System.out.println(showDress);
}
}
结果图
场景
1 装饰者模式是为已有功能动态添加更多功能的一种方式。
2 在实际生产的时候 当系统需要新功能的时候 是向旧的类中添加新的代码。这些新加的代码通常装饰了
原有类的核心职责或主要行为
3 装饰者模式提供了一个非常好的解决方案 它把每个要装饰的功能放在单独的类中,并让这个类包装它所有装饰的对象,
因此,当需要执行特殊行为时。客户可以根据选择的按顺序的使用装饰者功能包装对象。
优点
1 把类中装饰的功能从类中移除,简化原有的类。
2 把核心职责跟,装饰的职责分开,有效的去除重复的相关逻辑。