天天看点

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("销售方正电脑");
  
 }      
}

      

继续阅读