设计模式

在项目的开发中碰到或实践过的一些设计模式,回顾一下这些设计模式,备忘。

单例模式

单例模式在全局范围内,同一个类只构造一个对象,全局范围可以引用。减少因对象创造、销毁带来的资源消耗。


public class OtherXiaoerSingleton {

    private static OtherXiaoerSingleton singletone = null;
    //屏蔽掉新建对象
    private OtherXiaoerSingleton() {

    }

    public synchronized static  OtherXiaoerSingleton getInstance() {
        if (singletone == null) {
            singletone = new OtherXiaoerSingleton();
        }
        return singletone;
    }

    public synchronized String getOtherXiaoer(){
       //具体的业务实现
    }
}

策略模式

先定义一套接口,各个具体实现类实现这套接口,后面可以根据key来取各个具体实现。

public interface BizDataHandler {

    Long create(Long caseId,Object o);  

    void update(Long caseId,Object o);

    Long process(Long caseId,HandleType handleType,Object o,Operator operator);

    Object query(Long caseId);

}

inCallHandler、appointmentBizDataHandler、normalSeatDataHandler对应的类分别实现上面这个接口,后面就可以根据key来获得想要的实现类。

    <bean name="bizDataHandlerFactory"
          class="com.alibaba.china.minerals.gembone.component.icase.BizDataHandlerFactory">
        <property name="handlers">
            <map>
                <entry key="general_complaint" value-ref="inCallDataHandler"/>
                <entry key="appointment.pwf_merchant" value-ref="appointmentBizDataHandler"/>
                <entry key="Task_CtpInCall_NormalSeat" value-ref="normalSeatDataHandler"/>
            </map>
        </property>
    </bean>

装饰模式

装饰模式是要分步的对数据加工处理。首先,我们要在数据处理类里面定义一个属性,属性里面包含所有对数据加工处理的类。这些类要有一个共同的数据处理方法。这里,我们可以定义一个接口方法,各个数据加工类实现这个公共的接口方法。 通用接口定义如下:

public interface DataDecorator<Data> {
    Data decorate(Data data);
}

定义了接口及方法,各个数据处理类实现这个接口方法,然后把这些数据处理类打包配置成数据处理入口类的一个属性,在初始化的时候注入到这个属性中。这样,不管这个属性有多少个具体的实现,都可以处理数据。 属性配置:

    <bean id="noteToCaseIndexDecorator"
          class="com.alibaba.china.sascab.component.icase.index.NoteToCaseIndexDecorator">
        <property name="decorators">
            <list>
                <bean class="com.alibaba.china.sascab.component.icase.index.decorator.notetocase.NormalSeatDecorator"/>
                <bean class="com.alibaba.china.sascab.component.icase.index.decorator.notetocase.WsCaseDecorator"/>
                <bean class="com.alibaba.china.sascab.component.icase.index.decorator.MemberInfoDecorator"/>
                <bean class="com.alibaba.china.sascab.component.icase.index.decorator.summary.ComplaintDecorator"/>
                <bean class="com.alibaba.china.sascab.component.icase.index.decorator.summary.AppointmentDecorator"/>
            </list>
        </property>
    </bean>

数据处理入口类:


public class NoteToCaseIndexDecorator implements DataDecorator<Map<String, String>>, InitializingBean {

    private List<DataDecorator<Map<String, String>>> decorators;

    public void setDecorators(List<DataDecorator<Map<String, String>>> decorators) {
        this.decorators = decorators;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        if (decorators.isEmpty()) {
            throw new IllegalStateException("CaseIndexDecorator has empty decorators!");
        }
    }

    @Override
    public Map<String, String> decorate(Map<String, String> data) {
        for (DataDecorator<Map<String, String>> decorator : decorators) {
            decorator.decorate(data);
        }
        return data;
    }
}