1、Component.java是定义一个对象的接口,可以给这些对象动态的添加职责
public abstract class Component
{
public abstract void Operation();
}
2、ConcreteComponent.java定义了一个具体的对象,也可以给这个对象添加一些职能。
public class ConcreteComponent extends Component
{
@Override
public void Operation()
{
// TODO Auto-generated method stub
System.out.println("具体对象的操作");
}
}
3、Decorator.java装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。
public abstract class Decorator extends Component
{
protected Component component;
public void SetComponent(Component component)
{
this.component=component;
}
@Override
public void Operation()
{
// TODO Auto-generated method stub
if(component!=null)
{
component.Operation();
}
}
}
4、ConcreteDecoratorA.java就是具体的装饰对象,起到给Component添加职责的功能。
public class ConcreteDecoratorA extends Decorator
{
private String addedState;
@Override
public void Operation()
{
// TODO Auto-generated method stub
super.Operation();
addedState="New State";
System.out.println("具体装饰对象A的操作");
}
}
5、ConcreteDecoratorB.java就是具体的装饰对象。
public class ConcreteDecoratorB extends Decorator
{
@Override
public void Operation()
{
// TODO Auto-generated method stub
super.Operation();
this.AddedBehavior();
System.out.println("具体装饰对象B的操作");
}
private void AddedBehavior()
{
System.out.println("behavior");
}
}
6、test.java类
public class test
{
public static void main(String[] args)
{
ConcreteComponent c=new ConcreteComponent();
ConcreteDecoratorA d1=new ConcreteDecoratorA();
ConcreteDecoratorB d2=new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
}
}
具体的实例,cc是一个Person,然后对他进行不同的服饰搭配
1、Person.java,对Person类进行衣着设置和行为设置。
public class Person
{
public void Show();
}
2、ConcretePerson.java,具体的人的名称以及行为设置
public class ConcretePerson extends Person
{
protected String name;
public ConcretePerson(String name)
{
this.name=name;
}
@Override
public void Show()
{
System.out.println("装扮的人是:"+name);
System.out.println("今天很高兴");
}
}
3、Decorator.java,装扮类
public class Decorator extends Person
{
protected Person person;
public void SetDecorate(Person person)//接受具体的装扮类的对象
{
this.person=person;
}
@Override
public void Show()
{
// TODO Auto-generated method stub
if(person!=null)
{
person.Show();
}
}
}
4、PersonDecoratorA.java具体的装扮类
public class PersonDecoratorA extends Decorator
{
@Override
public void Show()
{
// TODO Auto-generated method stub
System.out.println("穿衬衫");
super.Show();//调用父类的Show方法,实现了功能累加
}
}
5、PersonDecoratoB.java具体的装扮类
public class PersonDecoratorB extends Decorator
{
@Override
public void Show()
{
// TODO Auto-generated method stub
System.out.println("穿西服");
super.Show();
}
}
6、测试类test1.java
public class test1
{
public static void main(String[] args)
{
Person p=new ConcretePerson("cc");
System.out.println("第一种装扮:");
PersonDecoratorA pa=new PersonDecoratorA();
PersonDecoratorB pb=new PersonDecoratorB();
pa.SetDecorate(p);
pb.SetDecorate(pa);
pb.Show();
}
}
运行结果: