/**
* 在这个源代码程序的编写中,我们很明显的感觉到扩展的吃力。因为类的数量会急剧膨胀。
* 如果要增加一个品牌,或者一种类型的电脑,都会有大量的工作要完成。
* 违反单一职责原则:
* 一个类,联想笔记本,有两个引起类型变化的东西。
* 这个类型中,有两个变化的维度。电脑类型和电脑品牌。
*
*/
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 wannachan@outlook.com
* 时间:2015年4月6日09:53:46
* 为了说明方便扩展,我们增加了方正的品牌
*/
package com.bjsxt.cn.bridge;
public class Fangzheng implements Brand {
@Override
public void sale() {
System.out.println("销售方正电脑");
}
}