大話設計モード3装飾モードのjavaコード実現


1,Personクラス(ConcreteComponent)
package yx.designpattern.decorator;

//Person (ConcreteComponent)
public class Person {
	private String name;

	public Person(){
		
	}
	
	public Person(String name) {
		this.name = name;
	}
	
	public void show(){
		System.out.println("   :"+this.name);
	}
	

}

2、アパレル類(Decorator)
package yx.designpattern.decorator;

//   (Decorator)
public class Finery extends Person {
	protected Person component;
	
	//  
	public void decorate(Person component){
		this.component=component;
	}

	@Override
	public void show() {
		if(component!=null){
			component.show();
		}
	}
}

3、具体的な服装類(ConcreteFinery)
package yx.designpattern.decorator;

//     (ConcreteFinery)
public class ConcreteFineryA extends Finery {
	@Override
	public void show() {
		super.show();
		System.out.println("     A");
	}

}
package yx.designpattern.decorator;
//     (ConcreteFinery)
public class ConcreteFineryB extends Finery {
	@Override
	public void show() {
		super.show();
		System.out.println("     B");
	}

}
package yx.designpattern.decorator;
//     (ConcreteFinery)
public class ConcreteFineryC extends Finery {
	@Override
	public void show() {
		super.show();
		System.out.println("     C");
	}

}
package yx.designpattern.decorator;
//     (ConcreteFinery)
public class ConcreteFineryD extends Finery {
	@Override
	public void show() {
		super.show();
		System.out.println("     D");
	}

}
package yx.designpattern.decorator;
//     (ConcreteFinery)
public class ConcreteFineryE extends Finery {
	@Override
	public void show() {
		super.show();
		System.out.println("     E");
	}

}

4、クライアントテストクラス
package yx.designpattern.decorator;

public class Test {
	public static void main(String[] args) {
		Person p1=new Person("  ");
		Finery f1=new ConcreteFineryA();
		Finery f2=new ConcreteFineryB();
		Finery f3=new ConcreteFineryC();
		
		f1.decorate(p1);
		f2.decorate(f1);
		f3.decorate(f2);
		
		f3.show();
		
		
		Person p2=new Person("  ");
		Finery f4=new ConcreteFineryD();
		Finery f5=new ConcreteFineryE();
		
		f4.decorate(p2);
		f5.decorate(f4);
		
		f5.show();
		
		
		Person p3=new Person("  ");
		
		f5.decorate(p3);//        ,          
		f2.decorate(f5);
		f4.decorate(f2);
		f1.decorate(f4);
		f3.decorate(f1);
		f3.show();
		
	}
}