桥接模式+装饰器模式的区别

82 阅读1分钟
//抽象类:建筑
public abstract class Building {
    protected Paint paint;
    public Building(Paint paint) {
        this.paint = paint;
    }
    public abstract void decorate();
}
//接口:油漆
public interface Paint {
    void decorateImpl();
}
//教学楼
public class TeachingBuilding extends Building {
    public TeachingBuilding(Paint paint) {
        super(paint);
    }

    @Override
    public void decorate() {
        System.out.print("普通的教学楼");
        paint.decorateImpl();
    }
}
//实验楼
public class LaboratoryBuilding extends Building {
    public LaboratoryBuilding(Paint paint) {
        super(paint);
    }

    @Override
    public void decorate() {
        System.out.print("普通的实验楼");
        paint.decorateImpl();
    }
}
public class RedPaint implements Paint {
    @Override
    public void decorateImpl() {
        System.out.println("被红色油漆装饰过。");
    }
}
public class GreenPaint  implements Paint {
    @Override
    public void decorateImpl() {
        System.out.println("被绿色油漆装饰过。");
    }
}
public class BulePaint implements Paint {
    @Override
    public void decorateImpl() {
        System.out.println("被蓝色油漆装饰过。");
    }
}
//接口:建筑
public interface Building {
    void decorate();
}
//抽象类:油漆
public abstract class Paint implements Building {
    protected Building building;

    public Paint(Building building) {
        this.building = building;
    }
    public void decorate(){
        building.decorate();
    }
}
//实验楼
public class LaboratoryBuilding implements Building{
    @Override
    public void decorate() {
        System.out.print("普通的实验楼");
    }
}
 //教学楼
public class TeachingBuilding implements Building {
    @Override
    public void decorate() {
        System.out.print("普通的教学楼");
    }
}
//红色油漆
public class RedPaint extends Paint {
    public RedPaint(Building building) {
        super(building);
    }

    @Override
    public void decorate() {
        building.decorate();
        decorateByRedPaint();
    }
    public void decorateByRedPaint(){
        System.out.print("被红色油漆装饰过");
    }
}
//绿色油漆
public class GreenPaint extends Paint {
    public GreenPaint(Building building) {
        super(building);
    }

    @Override
    public void decorate() {
        building.decorate();
        decorateByGreenPaint();
    }
    public void decorateByGreenPaint(){
        System.out.print("被绿色油漆装饰过");
    }
}
//蓝色油漆
public class BulePaint extends Paint {
    public BulePaint(Building building) {
        super(building);
    }

    @Override
    public void decorate() {
        building.decorate();
        decorateByBluePaint();
    }
    public void decorateByBluePaint(){
        System.out.print("被蓝色油漆装饰过");
    }
}
public class  DecoratorPatternDemo {
    public static void main(String[] args) {

        System.out.println("\n-*-被红色油漆装饰过的普通的教学楼-*-");
        Building redTeachingBuilding=new RedPaint(new TeachingBuilding());
        redTeachingBuilding.decorate();
        System.out.println("\n-*-被绿色油漆装饰过的普通的教学楼-*-");
        Building greenTeachingBuilding=new GreenPaint(new TeachingBuilding());
        greenTeachingBuilding.decorate();
        System.out.println("\n-*-被红色油漆装饰过的普通的实验楼-*-");
        Building redLaboratoryBuilding=new RedPaint(new LaboratoryBuilding());
        redLaboratoryBuilding.decorate();
        System.out.println("\n-*-被绿色油漆装饰过的普通的实验楼-*-");
        Building greenLaboratoryBuilding=new GreenPaint(new LaboratoryBuilding());
        greenLaboratoryBuilding.decorate();
        System.out.println("\n-*-被红色和绿色油漆装饰过的普通的实验楼-*-");
        Building building=new GreenPaint(new RedPaint(new LaboratoryBuilding()));
        building.decorate();
        System.out.println("\n-*-被红色和绿色和蓝色油漆装饰过的普通的实验楼-*-");
        Building building1=new BulePaint(new GreenPaint(new RedPaint(new LaboratoryBuilding())));
        building1.decorate();
    }
}