光看文字描述和例子桥接模式和装饰器模式最让人混淆,二者都是为了防止类爆炸的问题,怎么区分。
问题1:装饰器模式本生类的结构稳定,而桥接模式类的结构部分稳定,这怎么理解?
问题2:装饰器和桥接模式的使用场景。
一、总结:
桥接模式关注的是shape的变化对于DrawApi无关,并且shape的变化无法预知,比如Circle类中可以延伸出很多不同的实现,比如在圆的参数需要通过不同的计算方式来设置半径,x,y,这儿Circle就可能有不同的类,但是对于Draw类说这个对它无关。 这儿分离就是解决类爆炸。
装饰器模式关注的是可以预知的shape的变化但是DrawApi部分的变化是在shape对象已经产生之后。因此你看到的是DrawApi的实现构造器里面需要传Shape实现的参数。
二、分析避免类爆炸:
1、桥接模式:
我们看看菜鸟教程写的意图:将抽象部分与实现部分分离,使它们都可以独立的变化。这个抽象与实现部分怎么分离的???
(抽象是菜鸟中的DrawAPI类和Shape,实现就是两边的实现。 主要就是为了职责单一,代码复用。)
下面用文字注明了Shape的实现Circle可能发生的变化。
目的:我们需要有红色的圆和绿色的圆。
public abstract class Shape {
protected DrawAPI drawAPI; //桥接模式聚合点在这儿
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
public abstract void draw();
}
public class Circle implements Shape{
int radius;
int x ;
int y;
public RedCircle(int radius, int x, int y){
this.radius = radius;
this.x = x;
this.y = y;
}
public void draw(int radius, int x, int y) {
//do something。这儿可以独立变化,因为这儿变化是没有规律的。但是对于DrawApi来说这儿变化不关心。
drawAPI.drawCircle(radius,x,y);
}
}
public interface DrawAPI {
public void drawCircle(int radius, int x, int y);
}
public class RedCircle extends DrawAPI{
String color = "red";
public RedCircle(int radius, int x, int y){
this.radius = radius;
this.x = x;
this.y = y;
}
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: " + color +", radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
public class GreenCircle extends Circle{
String color = "green";
public GreenCircle(int radius, int x, int y){
this.radius = radius;
this.x = x;
this.y = y;
}
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: " + color +", radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
2、装饰器模式:
我们看看菜鸟教程写的意图:动态地给一个对象添加一些额外的职责。注意是给Shape添加新功能,也就是关注变化的位置是DrawApi,因为Shape的对象已经创建完成了。