/**
* 在這個源代碼程式的編寫中,我們很明顯的感覺到擴充的吃力。因為類的數量會急劇膨脹。
* 如果要增加一個品牌,或者一種類型的電腦,都會有大量的工作要完成。
* 違反單一職責原則:
* 一個類,聯想筆記本,有兩個引起類型變化的東西。
* 這個類型中,有兩個變化的次元。電腦類型和電腦品牌。
*
*/
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("銷售方正電腦");
}
}