装饰器模式

概念:

 

 

在装饰模式中的角色有:

  ●  抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。                                        Person           TokenStream            

  ●  具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类,实际中需要附加的类                      CodingFarmer       StandardTokenizer

  ●  装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。           Everyman          TokenFilter

  ●  具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。它都有具体构件角色的一个对象引用 AnalysisDesigner   SpecialCharFilter

 

 

运行测试类的结果:

需求分析!
界面设计!
码农难道每天只是加班敲代码,难道就没有其他的事情做了吗?,错了,看看我的上面和下面,还有很多没写
与客户沟通,哪些地方还需要修改!

示例:

Person类

package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: Person

 * @Description: TODO(人:接口或抽象类 )  抽象构件角色

 * @author andy

 * @date 2014-8-21 下午3:46:56

 */
public interface Person {
    void working();
}
CodingFarmer 
package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: CodingFarmer

 * @Description: TODO(码农:具体需要装饰的类) 具体构件角色

 * @author andy

 * @date 2014-8-21 下午3:48:38

 */
public class CodingFarmer implements Person {

    public void working() {
        System.out.println("码农难道每天只是加班敲代码,难道就没有其他的事情做了吗?,错了,看看我的上面和下面,还有很多没写");
    }

}
Everyman 
package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: Everyman

 * @Description: TODO(普通人:装饰器)  装饰角色

 * @author andy

 * @date 2014-8-21 下午3:52:06

 */
public abstract class Everyman implements Person {
    public abstract void working() ;

}
AnalysisDesigner 
package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: AnalysisDesigner

 * @Description: TODO(需求分析师)具体装饰角色

 * @author andy

 * @date 2014-8-21 下午4:02:15

 */
public class AnalysisDesigner extends Everyman {
    private Person person;
    public AnalysisDesigner(Person person){
        this.person = person;
    }

    public void working() {
        doDemandAnalysis();
        person.working();
    }

    private void doDemandAnalysis() {
        System.out.println("需求分析!");
    }

}
WebDesigner 
package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: WebDesigner

 * @Description: TODO(网页设计师)具体装饰角色

 * @author andy

 * @date 2014-8-21 下午3:58:44

 */
public class WebDesigner extends Everyman {
    private Person person;
    
    public WebDesigner(Person person){
        this.person = person;
    }
    
    public void working() {
        doUIDesign();
        person.working();
    }


    private void doUIDesign() {
        System.out.println("界面设计!");
    }

}
Sales 
package designMode.decorator;

/** 
 * @Package designMode.decorator

 * @ClassName: Sales

 * @Description: TODO(商务销售) 具体装饰角色

 * @author andy

 * @date 2014-8-21 下午4:05:44

 */
public class Sales extends Everyman {
    private Person person;
    public Sales(Person person){
        this.person = person;
    }

    public void working() {
        person.working();
        doTalk();
    }

    private void doTalk() {
        System.out.println("与客户沟通,哪些地方还需要修改!");
    }

}
MainTest 
package designMode.decorator;

/**
 * @Package designMode.decorator
 * 
 * @ClassName: MainTest
 * 
 * @Description: TODO(这里用一句话描述这个类的作用)
 * 
 * @author andy
 * 
 * @date 2014-8-21 下午02:48:22
 */
public class MainTest {
    public static void main(String[] args) {
        Person person = new CodingFarmer();
        person = new WebDesigner(person);
        person = new AnalysisDesigner(person);
        person = new Sales(person);
        person.working();
    }
}

 

 

什么时候使用,网上都是这样说:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时

 

个人感觉记住它被实际应用的地方比较实在,装饰器模式在如Java I/O的类库,还有lucene切词器、过滤器都有广泛巧妙的应用,记概念我感觉不靠谱,就像数据结构的知识,一定要结合它的实际用处和自己理解之后的简单通俗易懂的例子,如果没有弄明白,很快就会忘记,下次又要花费更多的时间去理解记忆!

 

只不过StandardTokenizer多继承了一个Tokenizer(用来初始化数据来源,灵活运用,实际项目会有点点变化)

StandardTokenizer tokenStream;

TokenStream filteredTokenStream;

 

都是执行incrementToken方法,先用标准StandardTokenizer切词,得到一个term,再用LowerCaseFilter转换成小写,再用StopFilter过滤掉停用词,再用SpecialCharFilter过滤掉特殊字符,得到我们我们的term!

posted on 2014-08-21 16:45  lovebeauty  阅读(1210)  评论(0编辑  收藏  举报

导航