装饰者模式
在不必改变原类文件和使用继承的情况下,动态地拓展一个对象的功能。他是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
装饰对象包含一个真实对象的引用
- 装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰着可以提供比继承更多的灵活性。解决了使用继承带来的大量的子类。
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合
package zhuangshims;
public interface MakeUp {
public abstract void make();
}
package zhuangshims;
public class MyGirl implements MakeUp {
@Override
public void make() {
System.out.println("简单的洗漱");
}
}
public class Decorater implements MakeUp {
private MakeUp makeUp;
public Decorater(MakeUp makeUp) {
this.makeUp = makeUp;
}
@Override
public void make() {
this.makeUp.make();
}
}
package zhuangshims;
public class Eyebrow extends Decorater{
public Eyebrow(MakeUp makeUp) {
super(makeUp);
}
private void makeEyebrow(){
System.out.println("简单用绿色画一下就行了");
}
@Override
public void make() {
// TODO Auto-generated method stub
super.make();
this.makeEyebrow();
}
}
package zhuangshims;
public class Eyeliner extends Decorater{
public Eyeliner(MakeUp makeUp) {
super(makeUp);
}
private void makeEyeliner(){
System.out.println("简单画一下就好了");
}
@Override
public void make() {
// TODO Auto-generated method stub
super.make();
this.makeEyeliner();
}
}
public class Lispstick extends Decorater{
public Lispstick(MakeUp makeUp){
super(makeUp);
}
private void makeLispstick(){
System.out.println("涂上淡红色口红!");
}
@Override
public void make() {
super.make();
this.makeLispstick();
}
}
package zhuangshims;
public class Test {
public static void main(String[] args) {
new Eyebrow(new Eyeliner(new MyGirl())).make();
}
}