zoukankan      html  css  js  c++  java
  • 设计模式——5.桥模式

    桥模式(Bridge)

    Bridge模式简介:

    抽象部分与它的实现部分分离,使它们都可以独立的变化

    合成、聚合复用原则:

    • 合成/组合(Composition),一种强拥有关系,体现严格的整体部分的关系,整体部分的生命周期一样。
    • 聚合(Aggregation),一种弱的拥有关系,体现整体包含对象的关系,对象不是整体的某一部分。

    Bridge模式结构:

    Bridge

    C++代码

    Implemantor类 & ConcreteImplementorA和B派生类:

    //file: Implementor.h
    #pragma once
    
    class Implementor
    {
    public:
    	Implementor();
    	virtual ~Implementor();
    	
    	virtual void operation();
    };
    
    class ConcreteImplementorA : public Implementor
    {
    public:
    	ConcreteImplementorA();
    	virtual ~ConcreteImplementorA();
    
    	virtual void operation();
    };
    
    class ConcreteImplementorB : public Implementor
    {
    public:
    	ConcreteImplementorB();
    	virtual ~ConcreteImplementorB();
    
    	virtual void operation();
    };
    
    //file: Implementor.cpp
    #include "pch.h"
    #include "Implementor.h"
    #include <iostream>
    using namespace std;
    
    //Implementor
    Implementor::Implementor() {}
    
    Implementor::~Implementor() {}
    
    void Implementor::operation() {}
    
    //ConcreteImplementorA
    ConcreteImplementorA::ConcreteImplementorA() {}
    
    ConcreteImplementorA::~ConcreteImplementorA() {}
    
    void ConcreteImplementorA::operation()
    {
    	cout << "Concrete Implement A's Func ." << endl;
    }
    
    //ConcreteImplementorB
    ConcreteImplementorB::ConcreteImplementorB() {}
    
    ConcreteImplementorB::~ConcreteImplementorB() {}
    
    void ConcreteImplementorB::operation()
    {
    	cout << "Concrete Implement B's Func ." << endl;
    }
    

    Abstraction类 & ConcreteAbstraction1和2派生类:

    //file: Abstraction.h
    #pragma once
    #include "Implementor.h"
    
    class Abstraction
    {
    protected:
    	Implementor * m_pImp;
    
    public:
    	Abstraction();
    	virtual ~Abstraction();
    
    	Abstraction(Implementor * pImp);
    	virtual void operation();
    };
    
    class ConcreteAbstraction1 : public Abstraction
    {
    public:
    	ConcreteAbstraction1();
    	ConcreteAbstraction1(Implementor *pImp);
    	virtual ~ConcreteAbstraction1();
    
    	virtual void operation();
    };
    
    class ConcreteAbstraction2 : public Abstraction
    {
    public:
    	ConcreteAbstraction2();
    	ConcreteAbstraction2(Implementor * pImp);
    	virtual ~ConcreteAbstraction2();
    
    	virtual void operation();
    };
    
    //file: Abstraction.cpp
    #include "pch.h"
    #include "Abstraction.h"
    #include <iostream>
    
    //Abstraction
    Abstraction::Abstraction() {}
    
    Abstraction::~Abstraction()
    {
    	delete m_pImp;
    }
    
    Abstraction::Abstraction(Implementor *pImp)
    {
    	m_pImp = pImp;
    }
    
    void Abstraction::operation() {}
    
    //ConcreteAbstraction1
    ConcreteAbstraction1::ConcreteAbstraction1() {}
    
    ConcreteAbstraction1::ConcreteAbstraction1(Implementor *pImp) : Abstraction(pImp) {}
    
    ConcreteAbstraction1::~ConcreteAbstraction1() {}
    
    void ConcreteAbstraction1::operation()
    {
    	std::cout << "Concrete Abstraction 1's Addition Action ." << std::endl;
    	m_pImp->operation();
    }
    
    //ConcreteAbstraction2
    ConcreteAbstraction2::ConcreteAbstraction2() {}
    
    ConcreteAbstraction2::ConcreteAbstraction2(Implementor *pImp) : Abstraction(pImp) {}
    
    ConcreteAbstraction2::~ConcreteAbstraction2() {}
    
    void ConcreteAbstraction2::operation()
    {
    	std::cout << "Concrete Abstraction 2's Addition Action ." << std::endl;
    	m_pImp->operation();
    }
    

    客户端代码:

    //file: BridgePattern.cpp : This file contains the 'main' function. Program execution begins and ends there.
    #include "pch.h"
    #include "Abstraction.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	Implementor *imp = new ConcreteImplementorA();
    	Abstraction *a1 = new ConcreteAbstraction1(imp);
    	a1->operation();
    
    	Abstraction *a2 = new ConcreteAbstraction2(new ConcreteImplementorB());
    	a2->operation();
    
    	char c;
    	cin >> c;
    	return 0;
    }
    

    C#代码

    Implemantor类 & ConcreteImplementorA和B派生类:

    public abstract class Implementor
    {
    	public abstract void Operation();
    }
    
    public class ConcreteImplementorA : Implementor
    {
    	public override void Operation()
    	{
    		Console.WriteLine("Concrete Implementor A's Func .");
    	}
    }
    
    public class ConcreteImplementorB : Implementor
    {
    	public override void Operation()
    	{
    		Console.WriteLine("Concrete Implementor B's Func .");
    	}
    }
    

    Abstraction类 & ConcreteAbstraction1和2派生类:

    public class Abstraction
    {
    	protected Implementor m_imple;
    
    	public Abstraction() { }
    
    	public Abstraction(Implementor implementor)
    	{
    		this.m_imple = implementor;
    	}
    
    	public void SetImple(Implementor implementor)
    	{
    		this.m_imple = implementor;
    	}
    
    	public virtual void Operation()
    	{
    		if (m_imple != null)
    			m_imple.Operation();
    	}
    }
    
    public class ConcreteAbstraction1 : Abstraction
    {
    	public ConcreteAbstraction1(Implementor implementor) : base(implementor) { }
    
    	public override void Operation()
    	{
    		Console.WriteLine("The ConcreteAbstraction 1's additional action .");
    		base.Operation();
    	}
    }
    
    public class ConcreteAbstraction2 : Abstraction
    {
    	public ConcreteAbstraction2(Implementor implementor) : base(implementor) { }
    
    	public override void Operation()
    	{
    		Console.WriteLine("The ConcreteAbstraction 2's additional action .");
    		base.Operation();
    	}
    }
    

    客户端代码:

    class Program
    {
    	static void Main(string[] args)
    	{
    		Implementor imp = new ConcreteImplementorA();
    		Abstraction absA = new ConcreteAbstraction1(imp);
    		absA.Operation();
    
    		Abstraction absB = new ConcreteAbstraction2(new ConcreteImplementorB());
    		absB.Operation();
    
    		Console.ReadKey(false);
    	}
    }
    

    REF

    书籍:

    设计模式与游戏开发、大话设计模式

    GitHub:

    https://github.com/me115/design_patterns

  • 相关阅读:
    如何用ST-LINK给STM32下载HEX文件
    快恢复二极管和肖特基二极管的区别和是否能够替代使用?
    Python环境变量配置
    IAP笔记
    如何将24位RGB颜色转换16位RGB颜色
    内网外网同时使用
    bootstraptable 服务端分页问题
    weblogic奇葩问题
    SSM框架
    java通过poi操作excel
  • 原文地址:https://www.cnblogs.com/sylvan/p/9745669.html
Copyright © 2011-2022 走看看