大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
动机
由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换
如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?
模式定义
将抽象不分(业务功能)与实现部分(平台实现)分离,是他们都可以独立变化。
案例
PC端和Mobile端平台和业务分离
朴素
class Messager{
public:
virtual void Login(string username,string password) = 0;
virtual void SendMessage(string message) = 0;
virtual void SendMessage(Image image) = 0;
virtual void PlaySound() = 0;
virtual void PlayShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~Messager(){
}
}
//平台实现
class PCMessagerBase : public Messager{
public:
virtual void PlaySound(){
//...
}
virtual void DrawSHape(){
//,,
}
virtual void WriteText(){
//..
}
virtual void connect(){
//,,
}
}
class MobileMessagerBase : public Messager{
public:
virtual void PlaySound(){
//...
}
virtual void DrawSHape(){
//,,
}
virtual void WriteText(){
//..
}
virtual void connect(){
//,,
}
}
//业务抽象
//精简版
class PCMessageLite : public PCMessagerBase{
public :
virtual void Login(string username,string password){
PCMessagerBase::Connect();
//..
}
virtual void SendMessage(string message){
PCMessagerBase::WriteText();
//..
}
virtual void SendPicture(Image image){
PCMessagerBase::DrawShape();
//..
}
}
//完美版
class PCMessagePerfect : public PCMessagerBase{
public :
virtual void Login(string username,string password){
PCMessagerBase::PlaySound();
//....
PCMessagerBase::Connect();
//...
}
virtual void SendMessage(string message){
PCMessagerBase::PlaySound();
//...
PCMessagerBase::WriteText();
//...
}
virtual void SendPicture(Image image){
PCMessagerBase::PlaySound();
//...
PCMessagerBase::DrawShape();
//...
}
}
//精简版
class MobileMessageLite : public MobileMessagerBase{
public :
virtual void Login(string username,string password){
MobileMessagerBase::Connect();
//..
}
virtual void SendMessage(string message){
MobileMessagerBase::WriteText();
//..
}
virtual void SendPicture(Image image){
MobileMessagerBase::DrawShape();
//..
}
}
//完美版
class MobileMessagerPerfect : public MobileMessagerBase{
public :
virtual void Login(string username,string password){
MobileMessagerPerfect::PlaySound();
//....
MobileMessagerPerfect::Connect();
//...
}
virtual void SendMessage(string message){
MobileMessagerPerfect::PlaySound();
//...
MobileMessagerPerfect::WriteText();
//...
}
virtual void SendPicture(Image image){
MobileMessagerPerfect::PlaySound();
//...
MobileMessagerPerfect::DrawShape();
//...
}
}
Bridge桥模式
class Messager{
private:
MessagerImp * messager;
public:
Messager():messager(messager){
}
virtual void Login(string username,string password) = 0;
virtual void SendMessage(string message) = 0;
virtual void SendMessage(Image image) = 0;
virtual ~Messager(){
}
}
class MessagerImp{
public:
virtual void PlaySound() = 0;
virtual void PlayShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~MessagerImp(){
}
}
//平台实现
class PCMessagerImp : public MessagerImp{
public:
virtual void PlaySound(){
//...
}
virtual void DrawSHape(){
//,,
}
virtual void WriteText(){
//..
}
virtual void connect(){
//,,
}
}
class MobileMessagerImp : public MessagerImp{
public:
virtual void PlaySound(){
//...
}
virtual void DrawSHape(){
//,,
}
virtual void WriteText(){
//..
}
virtual void connect(){
//,,
}
}
//业务抽象
//精简版
class PCMessageLite : public Messager{
public :
virtual void Login(string username,string password){
messageImp->Connect();
//..
}
virtual void SendMessage(string message){
messageImp->WriteText();
//..
}
virtual void SendPicture(Image image){
messageImp->DrawShape();
//..
}
}
//完美版
class PCMessagePerfect : public Messager{
public :
virtual void Login(string username,string password){
messageImp->PlaySound();
//....
messageImp->Connect();
//...
}
virtual void SendMessage(string message){
messageImp->PlaySound();
//...
messageImp->WriteText();
//...
}
virtual void SendPicture(Image image){
messageImp->PlaySound();
//...
messageImp->DrawShape();
//...
}
}
//精简版
class MobileMessageLite : public Messager{
public :
virtual void Login(string username,string password){
messageImp->Connect();
//..
}
virtual void SendMessage(string message){
messageImp->WriteText();
//..
}
virtual void SendPicture(Image image){
messageImp->DrawShape();
//..
}
}
//完美版
class MobileMessagerPerfect : public Messager{
public :
virtual void Login(string username,string password){
messageImp->PlaySound();
//....
messageImp->Connect();
//...
}
virtual void SendMessage(string message){
messageImp->PlaySound();
//...
messageImp->WriteText();
//...
}
virtual void SendPicture(Image image){
messageImp->PlaySound();
//...
messageImp->DrawShape();
//...
}
}
void Process(){
//运行时装配
MessagerImp *mImp = new PCMessagerImp();
Messager *m = new MobileMessagerPerfect(mImp);
}
要点总结
- Bridge模式使用”对象间地组合关系“解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自地维度来变换。所谓抽象和实现可以沿着各自维度地变化,即”子类化“他们
- Bridge模式有时候类似于多继承方案。但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
- Bridge模式的应用一般是”多个非常强的变换维度“,有时一个类也有多于两个变化的维度。这时可以使用Bridge的扩展模式
笔记
- 一个类中最好只有一个功能方向,如果有多个 ,就拆分成不同地类
- 多个维度:比如说 业务功能和平台实现
- 将某一个变换维度合在一起 打包成一个基类 用一个抽象指针指向它。如果有3个维度则把3个不分摘出来 用3个抽象指针指向它们
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169043.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...