设计模式之桥接模式(Bridge)

设计模式之桥接模式(Bridge)

桥模式更倾向于组合而不是继承。实现细节从层次结构推送到具有单独层次结构的另一个对象。
场景

有几种图形(正方形、长方形、圆形),为每种图形具有3种不同的颜色(红、黄、蓝),现需要把图形和颜色组合,可以画出3*3=9种图形,有两种方案
方案一:为每种形状都提供各种颜色的版本。
方案二:根据实际需要对颜色和形状进行组合。

图形接口

public interface Shape { void apply(); } public interface Shape { void apply(); }

颜色接口

public interface Color { void colour(); } public interface Color { void colour(); }

蓝色

public class Blue implements Color { @Override public void colour() { System.out.print("蓝色的"); } } public class Blue implements Color { @Override public void colour() { System.out.print("蓝色的"); } }

红色

public class Red implements Color { @Override public void colour() { System.out.print("红色的"); } } public class Red implements Color { @Override public void colour() { System.out.print("红色的"); } }

黄色

public class Yellow implements Color { @Override public void colour() { System.out.print("黄色的"); } } public class Yellow implements Color { @Override public void colour() { System.out.print("黄色的"); } }

圆形

public class Circle implements Shape { private final Color color; public Circle(Color color) { this.color = color; } @Override public void apply() { this.color.colour(); System.out.println("圆做轮子"); } } public class Circle implements Shape { private final Color color; public Circle(Color color) { this.color = color; } @Override public void apply() { this.color.colour(); System.out.println("圆做轮子"); } }

正方形

public class Square implements Shape{ private final Color color; public Square(Color color) { this.color = color; } @Override public void apply() { color.colour(); System.out.println("正方形做桌子"); } } public class Square implements Shape{ private final Color color; public Square(Color color) { this.color = color; } @Override public void apply() { color.colour(); System.out.println("正方形做桌子"); } }

长方形

public class Rectangle implements Shape{ private final Color color; public Rectangle(Color color) { this.color = color; } @Override public void apply() { this.color.colour(); System.out.println("长方形做门"); } } public class Rectangle implements Shape{ private final Color color; public Rectangle(Color color) { this.color = color; } @Override public void apply() { this.color.colour(); System.out.println("长方形做门"); } }

测试

 @Test public void circle(){ Color red = new Red(); Shape circle = new Circle(red); circle.apply(); new Rectangle(new Yellow()).apply(); } @Test public void circle(){ Color red = new Red(); Shape circle = new Circle(red); circle.apply(); new Rectangle(new Yellow()).apply(); }

注意
图形类中,使用final修饰,可避免出错,《effective java》中的原则
类图