国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java設計模式之外觀模式學習筆記

2019-11-26 13:42:06
字體:
來源:轉載
供稿:網友

外觀模式: 又稱門面模式: 外觀Facade為子系統的一組接口提供一個一致界面,使得這組子系統易于使用(通過引入一個新的外觀角色降低原系統復雜度,同時降低客戶類與子系統的耦合度).

圖片來源: 設計模式: 可復用面向對象軟件的基礎.

實現

案例需求: 租房

有過自己找房租房經歷的同學能夠體會得到找房是件很痛苦的事, 不光要挨個小區跑而且還要跟(二)房東討價還價. 于是后來學聰明了, 不再自己挨門挨戶的磨嘴皮子, 而是直接找像鏈家、我愛我家這樣的房屋中介, 他們手上握有一定的房源, 我們只需付給他們一筆傭金, 他們便可以代我們跟房東講價, 而且他們大都很專業, 省時間又省錢. 此時房屋中介就是一個外觀Facade, 而房屋的出租戶就是子系統SubSystem:

Facade 
 外觀類: 知道哪些子系統負責處理請求, 將客戶的請求代理給適當的子系統對象:

public class MediumFacade {  private CuiYuanApartment cuiyuan;  private XiXiApartment xixi;  private XiHuApartment xihu;  public MediumFacade() {    cuiyuan = new CuiYuanApartment("翠苑小區", 900, 1);    xixi = new XiXiApartment("西溪花園", 1200, 1);    xihu = new XiHuApartment("西湖小區", 2600, 1);  }  public void rentingHouse(double price) {    // 價錢合適而且有房可組    if (price >= cuiyuan.getPrice() && cuiyuan.getStatus() != 0) {      System.out.println("預訂" + cuiyuan.getLocation());      cuiyuan.setStatus(0);    } else if (price >= xixi.getPrice() && xixi.getStatus() != 0) {      System.out.println("預訂" + xixi.getLocation());      xixi.setStatus(0);    } else if (price >= xihu.getPrice() && xihu.getStatus() != 0) {      System.out.println("預訂" + xihu.getLocation());      xihu.setStatus(0);    } else {      System.out.println("出價太低/沒有房源 ...");    }  }}

SubSystem 
 子系統集合: 實現子系統功能, 處理Facade對象指派的任務(注意子系統內沒有任何Facade信息,即沒有任何Facade對象引用):

/** * @author jifang * @since 16/8/23 上午10:12. */public class XiHuApartment {  private String location;  private double price;  private int status;  public XiHuApartment(String location, double price, int status) {    this.location = location;    this.price = price;    this.status = status;  }  public String getLocation() {    return location;  }  public double getPrice() {    return price;  }  public int getStatus() {    return status;  }  public void setStatus(int status) {    this.status = status;  }}class XiXiApartment {  private String location;  private double price;  private int status;  public XiXiApartment(String location, double price, int status) {    this.location = location;    this.price = price;    this.status = status;  }  public String getLocation() {    return location;  }  public double getPrice() {    return price;  }  public int getStatus() {    return status;  }  public void setStatus(int status) {    this.status = status;  }}class CuiYuanApartment {  private String location;  private double price;  private int status;  public CuiYuanApartment(String location, double price, int status) {    this.location = location;    this.price = price;    this.status = status;  }  public String getLocation() {    return location;  }  public double getPrice() {    return price;  }  public int getStatus() {    return status;  }  public void setStatus(int status) {    this.status = status;  }}

Client
這樣, Client只需跟一個房屋中介聯系并給出我們的報價, 他們便會幫我們聯系所有符合的房東:

public class Client {  @Test  public void client() {    MediumFacade facade = new MediumFacade();    facade.rentingHouse(800);  }}

小結

有過面向對象開發經驗的同學 即使沒有聽說過外觀模式, 也完全有可能使用過他, 因為他完美的體現了依賴倒轉原則和迪米特法則的思想, 是非常常用的模式之一.

使用 

 

首先 在設計初期, 應該有意識的進行層次分離, 比如經典的三層架構, 層與層之間建立Facade, 這樣可以為復雜的子系統提供一個簡單的接口, 使耦合度大大降低.

其次 在開發階段, 子系統往往因為不斷的重構而變得越來越復雜, 增加Facade可以提供一個簡單的接口, 減少模塊間依賴.

第三 在維護一個遺留系統時, 可能這個系統已經非常難以維護和擴展了, 但因為它包含非常重要的功能, 新的需求必須依賴它, 此時可以為新系統開發一個Facade, 為設計粗糙或高復雜度的遺留代碼提供一個的比較清晰簡單的接口, 讓新系統與Facade交互, 而Facade與遺留代碼交互所有繁雜的工作.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 稻城县| 望都县| 双城市| 潍坊市| 集贤县| 商城县| 三穗县| 仁布县| 玛纳斯县| 南康市| 福州市| 缙云县| 镇江市| 克拉玛依市| 禄丰县| 平和县| 弥渡县| 凌源市| 广水市| 泽州县| 楚雄市| 旅游| 绩溪县| 镇雄县| 博湖县| 全椒县| 新邵县| 宜良县| 虎林市| 舒兰市| 集安市| 临泽县| 郁南县| 绍兴市| 友谊县| 五指山市| 沭阳县| 海兴县| 金溪县| 萍乡市| 连城县|