装饰模式,首先可以根据它的名字去理解。
例如这样的一个场景,早起要穿衣服,穿哪一件呢?
你可以T恤加牛仔加拖鞋的屌丝风;
也可以西服领带皮鞋的绅士风;
还能大T恤垮裤破球鞋的嘻哈路线;
。。。。
也就是说,你怎样搭配都可以,可以随性所欲的把某一件衣服和某一件裤子搭配起来。
这样的方式,如果采用简单工厂模式去构造的话,则可能构造出m*n个具体类,也就是全部枚举出来。
当然,真实的意图是,你想穿哪件就穿哪件,“搭配”起来。
当然使用的是这个装饰模式,首先还是给出类图:
如上面类图,其中有一个基础的抽象类Component,该类主要定义一些规范,让子类去具体实现,
而在Decorator类中,就是主要的装饰器,一方面获得一个Component的引用,另一方面继承自Component。
但是Decorator的实现主要是通过Component的具体子类来实现的(例如ConcreteComponent),除此之外,
在Decorator类中还能增加其他的方法,也就想前面例子中的,增加不同的衣服裤子,完全在于自己的Decorator如何写。
下面看具体的类实现代码:
Component类:
package com.blog.anla.Decorator;
/**
* component是定义一个对象接口,可以给这些
* 对象动态的添加职责
* @author U-ANLA
*
*/
public abstract class Component {
public abstract void operation();
}
package com.blog.anla.Decorator;
/**
* concretecomponent是定义了一个具体的对象,
* 也可以给这个对象添加一些职责
* @author U-ANLA
*
*/
public class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.println("operation类的具体操作");
}
}
package com.blog.anla.Decorator;
/**
* 抽象装饰类,集成了component,利用其来
* 完成component原有的功能,此外还能够添加
* 其他的功能,从而扩展原来的component的功能
* @author U-ANLA
*
*/
public abstract class Decorator extends Component{
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
if(component != null){
component.operation();
}
}
}
package com.blog.anla.Decorator;
/**
* 具体的装饰类A。
* @author U-ANLA
*
*/
public class ConcreteDecoratorA extends Decorator{
private String addedState; //增加本类独有的功能
@Override
public void operation(){
super.operation();
addedState = "ConcreteDecoratorA";
System.out.println("具体装饰对象A的操作");
}
}
ConcreteDecoratorB类:
package com.blog.anla.Decorator;
/**
* 具体装饰对象B
* @author U-ANLA
*
*/
public class ConcreteDecoratorB extends Decorator{
@Override
public void operation() {
super.operation();
anotherBehavior();
System.out.println("具体装饰对象B的操作");
}
private void anotherBehavior(){
System.out.println("I am another behavior!");
}
}
赠人玫瑰手留余香,如果那里书写有误欢迎提出来哈(oo)