设计模式疑难杂症之(桥接模式和装饰器模式)

 

光看文字描述和例子桥接模式和装饰器模式最让人混淆,二者都是为了防止类爆炸的问题,怎么区分。

问题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的对象已经创建完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值