天天看點

GOF23設計模式之橋接模式的實作

      
/**
 * 在這個源代碼程式的編寫中,我們很明顯的感覺到擴充的吃力。因為類的數量會急劇膨脹。
 * 如果要增加一個品牌,或者一種類型的電腦,都會有大量的工作要完成。
 * 違反單一職責原則:
 *   一個類,聯想筆記本,有兩個引起類型變化的東西。
 * 這個類型中,有兩個變化的次元。電腦類型和電腦品牌。
 * 
 */
package com.bjsxt.cn.bridge;      
public interface Computer {
 void sale();
}      
class Desktop implements Computer {      
 @Override
 public void sale() {
  System.out.println("銷售桌上型電腦");
 }
 
}      
class Laptop implements Computer {      
 @Override
 public void sale() {
  System.out.println("銷售筆記本");
 }
 
}      
class Pad implements Computer {      
 @Override
 public void sale() {
  System.out.println("銷售平闆電腦");
  
 }
 
}
class LenovoDesktop extends Desktop {
 @Override
 public void sale() {
  System.out.println("銷售聯想桌上型電腦");
 }
}      
class LenovoLaptop extends Laptop {
 @Override
 public void sale() {
  System.out.println("銷售聯想筆記本");
 }
}      
class LenovoPad extends Pad {
 @Override
 public void sale() {
  System.out.println("銷售聯想平闆電腦");
 }
}      
class ShenzhouDesktop extends Desktop {
 @Override
 public void sale() {
  System.out.println("銷售神州桌上型電腦");
 }
}      
class ShenzhouLaptop extends Laptop {
 
 @Override
 public void sale() {
  System.out.println("銷售神舟筆記本");
 }
}      
class ShenzhouPad extends Pad {
 @Override
 public void sale() {
  System.out.println("銷售神舟平闆");
 }
}      
class DellDesktop extends Desktop {
 @Override
 public void sale() {
  System.out.println("銷售戴爾桌上型電腦");
 }
}      
class DellLaptop extends Laptop { 
 @Override
 public void sale() {
  System.out.println("銷售戴爾筆記本");
 }
}      
class DellPad extends Pad {
 
 @Override
 public void sale() {
  System.out.println("銷售戴爾平闆");
 }
}      
package com.bjsxt.cn.bridge;      
public interface Brand {
 void sale();
}      
class Lenovo implements Brand {
 @Override
 public void sale() {
  System.out.println("銷售聯想電腦");
 }
}      
class Dell implements Brand {      
 @Override
 public void sale() {
 System.out.println("銷售戴爾電腦");
 }
 
}
      
/**
 * 時間:2015年4月6日09:37:19
 * 電腦類型繼承體系。
 * aggregration聚合意思
 * 
 * 橋接模式的實作:
 *   核心要點: 
 *    處理多繼承結構,處理多個次元變化的場景。
 *    将各個次元設計成獨立變化的繼承體系,使各個次元可以獨立的進行擴充。
 *    在抽象層建立關聯。
 */
package com.bjsxt.cn.bridge;
/**
 * 需要類而不是類型,是因為需要持有成員變量Brand類型
 * @author wanna_000
 *
 */
public class Computer2 {
 protected Brand brand;//肯定是要子類去通路它的。是以不能使用private
 
 public Computer2() {
 
 }      
 public Computer2(Brand brand) {
  this.brand = brand;
 }
 
 void sale() {
  brand.sale();
 }
 
 
}      
class Desktop2 extends Computer2 {
 
 public Desktop2(Brand brand) {
  this.brand = brand;//此時this.brand通路到的是父類中的成員變量brand
 }
 @Override
 void sale() {
  brand.sale();
  System.out.println("銷售桌上型電腦");
 }      
}      
class Laptop2 extends Computer2 {
 public Laptop2(Brand b) {
  brand = b;//這個時候就需要通路父類的brand成員變量
 }
 @Override
 void sale() {
  brand.sale();
  System.out.println("銷售筆記本");
 }
}      
class Pad2 extends Computer2 {
 @Override
 void sale() {
  super.sale();
  
  System.out.println("銷售平闆電腦");
 }
}
      
/**
 * 時間:2015年4月6日09:47:13
 * 程式作用:測試橋接模式的使用
 */
package com.bjsxt.cn.bridge;      
public class Client {
 public static void main(String[] args) {
  Computer2 computer2 = new Laptop2(new Lenovo());
  computer2.sale();
  
  //而如果此時我們想要增加一個品牌類型,方正,隻需要到建立一個品百Fangzheng實作Brand接口即可了。
  
  Computer2 c2 = new Desktop2(new Fangzheng());
  c2.sale();
 
 }
}      
/*
 *       
銷售聯想電腦
銷售筆記本      
 * 
 * */
      
/**
 * @author [email protected]
 * 時間:2015年4月6日09:53:46
 * 為了說明友善擴充,我們增加了方正的品牌
 */
package com.bjsxt.cn.bridge;      
public class Fangzheng implements Brand {      
 @Override
 public void sale() {
  System.out.println("銷售方正電腦");
  
 }      
}

      

繼續閱讀