Decorator,Bridge属于单一职责模式。
motivation:某些类型的固有实现逻辑,是的他们又多个维度的变化;需要使得类型在者多个维度上(如实现平台和实现的版本)进行灵活变化,而不带来额外的复杂度。
key interface or class:
1.接口类,如Messager;
2.接口实现类,如MessagerImp,用于被接口中函数调用以实现接口功能。
feature:一个接口类,和接口实现imp类。
structure:
template codes:
//重构前
//接口类
class Messager{
public:
virtual void Login()=0;
virtual void sendMessage()=0;
virtual void sendPicture()=0;
virtual void playSound()=0;
virtual void drawShape()=0;
virtual void writeContext()=0;
virtual void connect()=0;
virtual ~Messager(){
}
};
//不同平台不同实现方法
class PCMessagerBase: public Messager{
public:
virtual void playSound(){
//实现PC平台的playSound方法
}
virtual void drawShape(){
//实现PC平台的drawShape方法
}
virtual void writeContext(){
//实现PC平台的writeContext方法
}
virtual void connect(){
//实现PC平台的connect方法
}
};
class MobileMessagerBase: public Messager{
public:
virtual void playSound(){
//实现Mobile平台的playSound方法
}
virtual void drawShape(){
//实现Mobile平台的drawShape方法
}
virtual void writeContext(){
//实现Mobile平台的writeContext方法
}
virtual void connect(){
//实现Mobile平台的connect方法
}
};
//业务层面实现接口(已经对继承进行过组合重构之后,类似decorator)
class MessagerLite{
Messager* messager; //可以为PCMessagerBase,MobileMessagerBase
public:
MessagerLite(Messager* msg):messager(msg){}
virtual void Login(){
//实现对应平台的Lite版本Login方法
messager->connect(); //调用Base中方法
//...
}
virtual void sendMessage(){
//实现对应平台的Lite版本sendMessage方法
messager->writeContext(); //调用Base中方法
//...
}
virtual void sendPicture(){
//实现对应平台的Lite版本sendPicture方法
messager->drawShape(); //调用Base中方法
//...
}
};
class MessagerPerfect{
Messager* messager; //可以为PCMessagerBase,MobileMessagerBase
public:
MessagerPerfect(Messager* msg):messager(msg){}
virtual void Login(){
//实现对应平台的Perfect版本Login方法
//...
messager->connect(); //调用Base中方法
//...
}
virtual void sendMessage(){
//实现对应平台的Perfect版本sendMessage方法
//...
messager->writeContext(); //调用Base中方法
//...
}
virtual void sendPicture(){
//实现对应平台的Perfect版本sendPicture方法
//...
messager->drawShape(); //调用Base中方法
//...
}
};
//调用时
process(){
Messager* msg = new PCMessagerBase();
MessagerPerfect* pcMsg= new MessagerPerfect(msg);
}
//采用bridge模式重构之后
class Messager{
protect:
MessagerImp* messagerImp; //可以为PCMessagerBase,MobileMessagerBase
public:
virtual void Login()=0;
virtual void sendMessage()=0;
virtual void sendPicture()=0;
virtual ~Messager(){
}
};
class MessagerImp{
public:
virtual void playSound()=0;
virtual void drawShape()=0;
virtual void writeContext()=0;
virtual void connect()=0;
virtual ~MessagerImp(){
}
};
//不同平台不同实现方法
class PCMessagerBase: public MessagerImp{
public:
virtual void playSound(){
//实现PC平台的playSound方法
}
virtual void drawShape(){
//实现PC平台的drawShape方法
}
virtual void writeContext(){
//实现PC平台的writeContext方法
}
virtual void connect(){
//实现PC平台的connect方法
}
};
class MobileMessagerBase: public MessagerImp{
public:
virtual void playSound(){
//实现Mobile平台的playSound方法
}
virtual void drawShape(){
//实现Mobile平台的drawShape方法
}
virtual void writeContext(){
//实现Mobile平台的writeContext方法
}
virtual void connect(){
//实现Mobile平台的connect方法
}
};
//业务层面实现接口
class MessagerLite: public Messager{
public:
MessagerLite(Messager* msg):messager(msg){}
virtual void Login(){
//实现对应平台的Lite版本Login方法
messagerImp->connect(); //调用Base中方法
//...
}
virtual void sendMessage(){
//实现对应平台的Lite版本sendMessage方法
messagerImp->writeContext(); //调用Base中方法
//...
}
virtual void sendPicture(){
//实现对应平台的Lite版本sendPicture方法
messagerImp->drawShape(); //调用Base中方法
//...
}
};
class MessagerPerfect{
public:
MessagerPerfect(Messager* msg):messager(msg){}
virtual void Login(){
//实现对应平台的Perfect版本Login方法
//...
messagerImp->connect(); //调用Base中方法
//...
}
virtual void sendMessage(){
//实现对应平台的Perfect版本sendMessage方法
//...
messagerImp->writeContext(); //调用Base中方法
//...
}
virtual void sendPicture(){
//实现对应平台的Perfect版本sendPicture方法
//...
messagerImp->drawShape(); //调用Base中方法
//...
}
};
//调用时
process(){
MessagerImp* msgImp = new PCMessagerBase(); //PC平台的实现
Messager* pcMsg= new MessagerPerfect(msgImp); //Perfect版本的方法
}
summary:
1. bridge使用“对象间的组合关系”来解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度去变化;
2.bridge模式vs多继承,多继承违背单一职责原则(一个类已有一个变化维度),复用性不高;
3.bridge模式多用于”两个非常强的变化维度“,有多个变化维度时可以使用birdge模式的扩展。