1.状态模式。
当控制一个对象状态转变的条件表达式过于复杂时,把状态转移的过程转移到一系列表示不同状态的类当中去。
感觉适合用于状态转化时使用:
abstract class State{
public abstract void handle(Context context);
}
class ConcreteStateA extends State{
@Override
public void handle(Context context) {
// TODO Auto-generated method stub
System.out.println("ConcreteStateA");
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB extends State{
@Override
public void handle(Context context) {
// TODO Auto-generated method stub
System.out.println("ConcreteStateB");
context.setState(new ConcreteStateA());
}
}
class Context{
private State mState;
public void setState(State state){
mState=state;
}
public void request(){
mState.handle(this);
}
}
public class StatePattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
Context context=new Context();
context.setState(new ConcreteStateA());
for(int i=0;i<3;i++){
context.request();
}
}
}
状态模式与策略模式的对比:
虽然从UML的架构看,两个结构很像,但我觉得两个在设计的初衷上有本质的不同,对于状态模式而言,它需要实现的是一个类的各种状态的切换,体现在实现中就是,在State的handle方法中,有一个Context参数,在子类中,通过handle方法,不断切换传进去的参数Context的State。而策略模式中,由于不需要状态的切换,所以在抽象的方法中,就没有这样的参数。
2.适配器模式
在功能复用的过程中,由于接口的不同,通过适配器类来实现复用:
abstract class Universal{
public abstract void universalWork();
}
class Special{
public void specialWork(){
System.out.println("I can do specail work");
}
}
class Adapter extends Universal{
Special mSpecial=new Special();
@Override
public void universalWork() {
// TODO Auto-generated method stub
mSpecial.specialWork();
}
}
public class AdapterPattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
Universal universal=new Adapter();
universal.universalWork();
}
}
适配器模式与代理模式的比较:
乍一看和代理模式真是巨像无比啊。。。仔细分析,对代理模式而言,Proxy类和被代理类均实现了抽象的接口,而在适配器模式中,只有Adapter继承了抽象类。说白了,感觉Adapter的适应范围更广,管他Special有没有继承抽象类,方法的名字一不一样呢,直接组合进类里来使用。
Head First
装饰模式:将一个对象封装起来,以增加新的功能。
外观模式:将一群对象包装起来,对外提供一个简单的接口。
适配器模式:将一个对象包装起来,改变其接口。