设计模式-桥接模式

定义:

将抽象部分(业务功能)与实现部分(平台实现)分离,使他们能够独立地变化。

使用对象间的组合关系解耦了抽象和现实之间的绑定关系,使得抽象和实现可以沿着各自维度进行变化(子类化)。 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值