装饰器模式

public interface Shape {
    void draw();
}
public class Circle implements Shape {
    private static final String TAG = "zhoumao";

    @Override
    public void draw() {
        Log.d(TAG, "draw: " + getClass().getName());
    }
}
public class Rectangle implements Shape {
   private static final String TAG = "zhoumao";

   @Override
   public void draw() {
      Log.d(TAG, "draw: "+"Shape: Rectangle");
   }
}
public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }    
}
public class RedShapeDecorator extends ShapeDecorator {
    private static final String TAG = "zhoumao";

    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        super.draw();
        setRedBorder(super.decoratedShape);
    }

    private void setRedBorder(Shape decoratedShape) {
        Log.d(TAG, "setRedBorder: " + "Border Color: Red");
    }
}
public class RotateShapeDecorator extends ShapeDecorator {

    private static final String TAG = "zhoumao";
    public RotateShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        super.draw();
        setRotate();
    }

    private void setRotate(){
        Log.d(TAG, "setRotate: ");
    }
}

测试代码:

        Log.d(TAG, "Circle with normal border");
        circle.draw();


        Shape redCircle = new RedShapeDecorator(new Circle());
        Log.d(TAG, "\n******Circle of red border");
        redCircle.draw();

        Shape redRectangle = new RedShapeDecorator(new Rectangle());
        Log.d(TAG, "\n********Rectangle of red border");
        redRectangle.draw();

        Log.d(TAG, "\n**********Rectangle rotate of red border");
        Shape allRect = new RotateShapeDecorator(redRectangle);
        allRect.draw();

结果

05-06 05:10:40.650 7937-7937/? D/zhoumao: Circle with normal border
05-06 05:10:40.650 7937-7937/? D/zhoumao: draw: com.sankuai.tantan.decorator.Circle
05-06 05:10:40.650 7937-7937/? D/zhoumao: ******8Circle of red border
05-06 05:10:40.650 7937-7937/? D/zhoumao: draw: com.sankuai.tantan.decorator.Circle
05-06 05:10:40.650 7937-7937/? D/zhoumao: setRedBorder: Border Color: Red
05-06 05:10:40.650 7937-7937/? D/zhoumao: ********Rectangle of red border
05-06 05:10:40.650 7937-7937/? D/zhoumao: draw: Shape: Rectangle
05-06 05:10:40.650 7937-7937/? D/zhoumao: setRedBorder: Border Color: Red
05-06 05:10:40.650 7937-7937/? D/zhoumao: **********Rectangle rotate of red border
05-06 05:10:40.650 7937-7937/? D/zhoumao: draw: Shape: Rectangle
05-06 05:10:40.650 7937-7937/? D/zhoumao: setRedBorder: Border Color: Red
05-06 05:10:40.650 7937-7937/? D/zhoumao: setRotate: 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 策略模式:定义一系列算法的方法,所有的算法功能相同但是实现不同。 示例类图: 如上类图所示:鸭子有两个可能...
    Richard_80ec阅读 3,360评论 0 2
  • 前言 距离上一篇,间隔时间有点长哈(尴尬 ==!)经历过漫长的实习期,试用期,第一份工作终于慢慢走上正轨,中间发生...
    暗影飞客阅读 1,189评论 0 0
  • Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式。 一、定义: Decorat...
    木有粗面_9602阅读 314评论 0 1
  • 了解过Python的同学都知道,Python从语言层面支持装饰器模式,并配以语法糖 『@xx』的形式来提供更好的开...
    falm阅读 2,543评论 0 2
  • 今天微风凛凛,我们迎来了第一次家长会,这也是一次有意义的会面。 大会上,老师的精彩演讲让我...
    NiNi_0c48阅读 159评论 0 0