定义:
将抽象部分(业务功能)与实现部分(平台实现)分离,使他们能够独立地变化。
使用对象间的组合关系解耦了抽象和现实之间的绑定关系,使得抽象和实现可以沿着各自维度进行变化(子类化)。
class Messager{
protected:
MessagerImp* messagerImp;
Messager(MessagerImp* messagerImp):Messager(messagerImp){}
public:
virtual void Login(string username,string password)=0;
virtual void SendMessage(string message)=0;
virtual void SendPicture(Image image)=0;
virtual ~Message(){}
};
class MessagerImp{
public:
virtual void PlaySound()=0;
virtual void DrawShape()=0;
virtual void WriteText()=0;
virtual void connect()=0;
virtual ~MessageImp(){}
};
//1.平台实现
class PCMessagerImp:public MessagerImp{
public:
virtual void playSound(){//*****//}
virtual void DrawShape(){//*****//}
virtual void WriteText(){//*****//}
virtual void connect(){//*****//}
};
class MoblieMessagerImp:public MessagerImp{
public:
virtual void playSound(){//*****//}
virtual void DrawShape(){//*****//}
virtual void WriteText(){//*****//}
virtual void connect(){//*****//}
};
//2.业务抽象
//部分继承 部分组合
class MessagerLite:public Messager{
//MessagerImp* messagerImp;//加入父类
public:
MessagerLite(MessagerImp* messagerImp):Messager(messagerImp){}
virtual void Login(string username,string password){
messagerImp->connect();
}
virtual void SendMessage(string message){
messagerImp->WriteText();
}
virtual void SendPicture(Image image){
messagerImp->DrawShape();
}
};
class Messagerperfect:public Messager{
//MessagerImp* messager;//
public:
Messagerperfect(MessagerImp* messagerImp):Messager(messagerImp){}
virtual void Login(string username,string password){
messagerImp->PlaySound();
messagerImp->connect();
}
virtual void SendMessage(string message){
messagerImp->PlaySound();
messagerImp->WriteText();
}
virtual void SendPicture(Image image){
messagerImp->PlaySound();
messagerImp->DrawShape();
}
};
void progress(){
//运行时装配
MessagerImp* mImp=new PCMessagerImp();
Messager* m=new Messager(mImp);
}
go语言实现:
package main
import "fmt"
/**
* @Description: 消息发送接口
*/
type MessageSend interface {
send(msg string)
}
/**
* @Description: 短信消息
*/
type SMS struct {
}
func (s *SMS) send(msg string) {
fmt.Println("sms 发送的消息内容为: " + msg)
}
/**
* @Description: 邮件消息
*/
type Email struct {
}
func (e *Email) send(msg string) {
fmt.Println("email 发送的消息内容为: " + msg)
}
/**
* @Description: AppPush消息
*/
type AppPush struct {
}
func (a *AppPush) send(msg string) {
fmt.Println("appPush 发送的消息内容为: " + msg)
}
/**
* @Description: 站内信消息
*/
type Letter struct {
}
func (l *Letter) send(msg string) {
fmt.Println("站内信 发送的消息内容为: " + msg)
}
/**
* @Description: 用户触达父类,包含触达方式数组messageSends
*/
type Touch struct {
messageSends []MessageSend
}
/**
* @Description: 触达方法,调用每一种方式进行触达
* @receiver t
* @param msg
*/
func (t *Touch) do(msg string) {
for _, s := range t.messageSends {
s.send(msg)
}
}
/**
* @Description: 紧急消息做用户触达
*/
type TouchUrgent struct {
base Touch
}
/**
* @Description: 紧急消息,先从db中获取各种信息,然后使用各种触达方式通知用户
* @receiver t
* @param msg
*/
func (t *TouchUrgent) do(msg string) {
fmt.Println("touch urgent 从db获取接收人等信息")
t.base.do(msg)
}
/**
* @Description: 普通消息做用户触达
*/
type TouchNormal struct {
base Touch
}
/**
* @Description: 普通消息,先从文件中获取各种信息,然后使用各种触达方式通知用户
* @receiver t
* @param msg
*/
func (t *TouchNormal) do(msg string) {
fmt.Println("touch normal 从文件获取接收人等信息")
t.base.do(msg)
}
func main() {
//触达方式
sms := &SMS{}
appPush := &AppPush{}
letter := &Letter{}
email := &Email{}
//根据触达类型选择触达方式
fmt.Println("-------------------touch urgent")
touchUrgent := TouchUrgent{
base: Touch{
messageSends: []MessageSend{sms, appPush, letter, email},
},
}
touchUrgent.do("urgent情况")
fmt.Println("-------------------touch normal")
touchNormal := TouchNormal{ //
base: Touch{
messageSends: []MessageSend{sms, appPush, letter, email},
},
}
touchNormal.do("normal情况")
}
//本代码 转载自:https://blog.csdn.net/shida219/article/details/117279549