日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式—桥接模式

發布時間:2023/12/20 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式—桥接模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

這里以電視遙控器為例子引出橋接模式,首先每個牌子的電視都有一個遙控器,可以設計吧遙控器作為一個抽象類,抽象類中提供遙控器的所有實現,其他具體電視品牌的遙控器都繼承這個抽象類

?

這樣的實現使得每個不同型號的電視都有自己的遙控器實現,這樣的設計對于電視劇品牌的改變可以很好的應對,只要添加一個派生類就可以了。但是隨著時間的推移,用戶需要改變遙控器的功能,如:用戶可能需要添加一個返回上個臺的功能,這是就需要修改抽象類了,這樣就違反了設計原則,如果用戶同時改變電視劇的品牌型號和遙控器功能時,此時的設計就更麻煩了,而使用橋接模式可以很好的解決問題

?

橋接模式介紹

橋接模式即將抽象部分與實現部分脫耦,使它們可以獨立改變。對于上面的問題,抽象化也就是RemoteControl類,實現部分就是on(),off(),nextchannel(),這樣的方法。上面設計中抽象化和實現部分在一起,橋接模式的目的就是使兩者分開,我們把實現部分的變化封裝到另外一個類中,這樣一個思路就是橋接模式的實現

1)實際例子

抽象化部分代碼

?

//注釋:里面方法定義成virtual 以方便如果有類繼承此類時可以任意重寫其中的方法/// <summary>/// 抽象概念中的遙控器,扮演抽象化角色/// </summary>public class RemoteControl{private TV implementor;public TV Implementor{get { return implementor; }set { implementor = value; }}//public virtual void MdadCity()//{// implementor.MadeCity();//}/// <summary>/// 開電視機,這里抽象類中不再提供實現了,而是調用實現類中的實現/// </summary>public virtual void On(){implementor.On();}/// <summary>/// 關電視機/// </summary>public virtual void Off(){implementor.Off();}/// <summary>/// 換頻道/// </summary>public virtual void RuneChannel(){implementor.RuneChannel();}}/// <summary>/// 具體遙控器/// </summary>public class ConcreteRemote : RemoteControl{public override void RuneChannel(){Console.WriteLine("---------------------");base.RuneChannel();Console.WriteLine("---------------------");}}

?

?實現方法的部分代碼我們用另外一個抽象類TV封裝了遙控器的功能變化,具體實現交給具體型號電視去完成

//注釋:定義成抽象類,如果有公共的方法可以在該抽象類中進行實習,如果是接口的話有些公共的方法就不能復用了/// <summary>/// 電視機,提供抽象方法/// </summary>public abstract class TV{//public void MadeCity()//{// Console.WriteLine("made in china");//}public abstract void On();public abstract void Off();public abstract void RuneChannel();}/// <summary>/// 長虹牌電視機,重寫基類的抽象方法/// 提供具體的實現/// </summary>public class ChangHong : TV{public override void On(){Console.WriteLine("長虹牌電視機打開");}public override void Off(){Console.WriteLine("長虹牌電視機關閉");}public override void RuneChannel(){Console.WriteLine("長虹牌電視機換臺");}}/// <summary>/// 三星牌電視機,重寫基類的抽象方法/// </summary>public class SanXing : TV{public override void On(){Console.WriteLine("三星牌電視機打開");}public override void Off(){Console.WriteLine("三星牌電視機關閉");}public override void RuneChannel(){Console.WriteLine("三星牌電視機換臺");}}

?客戶端調用時

static void Main1(string[] args){RemoteControl remoteControl = new ConcreteRemote();remoteControl.Implementor = new ChangHong();remoteControl.On();remoteControl.RuneChannel();remoteControl.Off();Console.WriteLine();remoteControl.Implementor = new SanXing();remoteControl.On();remoteControl.RuneChannel();remoteControl.Off();Console.Read();}

?運行結果:

上面打代碼實現中,遙控器的實現方法不再遙控器抽象類中實現了,而是把實現部分用另一個電視類去封裝,遙控器中只包含電視劇類的引用。通過橋接模式,我們把抽象化和實現部分代碼分離,這樣就可以很好的應對這兩個方面的變化了。

?

2)橋接模式介紹

3)橋接模式分析

優點:抽象接口與其實現解耦

???????? 抽象和實現可以獨立擴展,不會影響對方

缺點:增加了系統的復雜度

4)使用場景

如果一個系統需要在構件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個層次之間建立靜態的聯系

設計要求實現化角色的任何改變不應擔影響客戶端,或者實現化角色的改變對客戶端是完全透明的

需要跨越多個平臺的圖形和窗口系統上

一個類存在兩個對立變化的緯度,且兩個緯度都需要進行擴展

5)實際例子

橋接模式經常用于具體的系統開發中,對于三層架構中就應用了橋接模式,三層架構中的業務邏輯層bll中通過橋接模式與數據庫操作層解耦,其實現方式就是在bll層中引用了dal層中一個引用,這樣數據操作的實現可以在不改變客戶端代碼的情況下動態進行更換了

?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApplication1 {// BLL 層public class BusinessObject{private DataAccess dataAccess;private string city;public BusinessObject(string city){this.city = city;}public DataAccess DataAccess{get { return dataAccess; }set { dataAccess = value; }}public virtual void Add(string name){dataAccess.AddRecord(name);}public virtual void Delete(string name){dataAccess.DeleteRecord(name);}public virtual void Update(string name){dataAccess.UpdateRecord(name);}public virtual string Get(int index){return dataAccess.GetRecord(index);}public virtual void ShowAll(){Console.WriteLine();Console.WriteLine("{0}的顧客有:", city);dataAccess.ShowAllRecords();}}public class CustomersBusinessObject : BusinessObject{public CustomersBusinessObject(string city) : base(city) { }public override void ShowAll(){Console.WriteLine("----------");base.ShowAll();Console.WriteLine("___________");}}/// <summary>/// 相當于三層架構中數據訪問層(DAL)/// </summary>public abstract class DataAccess{// 對記錄的增刪改查操作public abstract void AddRecord(string name);public abstract void DeleteRecord(string name);public abstract void UpdateRecord(string name);public abstract string GetRecord(int index);public abstract void ShowAllRecords();}public class CustomersDataAccess : DataAccess{private List<string> customers = new List<string>();public CustomersDataAccess(){customers.Add("Learning Hard");customers.Add("張三");customers.Add("李四");customers.Add("王五");}public override void AddRecord(string name){customers.Add(name);}public override void DeleteRecord(string name){customers.Remove(name);}public override void UpdateRecord(string updatename){customers[0] = updatename;}public override string GetRecord(int index){return customers[index];}public override void ShowAllRecords(){foreach (string name in customers){Console.WriteLine(" " + name);}}} }

?

?客戶端調用:

// 類似Web應用程序static void Main(string[] args){BusinessObject customers = new CustomersBusinessObject("shanghai");customers.DataAccess = new CustomersDataAccess();customers.Add("小六");Console.WriteLine("增加了一位成員的結果:");customers.ShowAll();customers.Delete("王五");Console.WriteLine("刪除了一位成員的結果:");customers.ShowAll();customers.Update("Learning_Hard");Console.WriteLine("更新了一位成員的結果:");customers.ShowAll();Console.Read();}

?運行結果:

?

轉載于:https://www.cnblogs.com/xishuqingchun/p/5012074.html

總結

以上是生活随笔為你收集整理的设计模式—桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。