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();
}
}