标签:block 就是 关闭 tor pre 类对象 new 避免 javac
装饰者模式(Decorator或Wrapper)
被装饰者将扩展功能的任务委托给装饰者,从而避免直接修改原来的类(开闭原则:对扩展开放,对修改关闭)
装饰者与被装饰者拥有同样的超类型
装饰者可以在被装饰者的行为前或行为后,增加自己的行为
装饰者模式说白了,就是在装饰者类中持有超类对象,增强超类对象的功能,或者进行扩展(虽然极其简单,但是很有用)。
Java io包中的包装流就用到了装饰者模式,用来扩展基础流的功能。
装饰者模式示例:
小白程序员一开始啥都不会
public class Coder
{
public double getSalary()
{
return 0;
}
public String getSkill()
{
return "啥也不会";
}
}
私下琢磨了一天后,学会了HelloWorld(增强了超类功能,但没有修改超类中的代码)
public class HelloWorldCoder extends Coder
{
private Coder coder;
public HelloWorldCoder(Coder coder)
{
this.coder = coder;
}
@Override
public double getSalary()
{
return coder.getSalary()+100;
}
@Override
public String getSkill()
{
return coder.getSkill()+",会写HelloWorld了";
}
}
通过阅读《Java从入门到精通》,小白终于精通了Java,顺便学会了CRUD
public class JavaCoder extends Coder
{
private Coder coder;
public JavaCoder(Coder coder)
{
this.coder = coder;
}
@Override
public double getSalary()
{
return coder.getSalary()+1000;
}
@Override
public String getSkill()
{
return coder.getSkill()+",精通Java";
}
// 扩展功能
public void curd()
{
System.out.println("会写增删改查了");
}
}
小白还在不停的学习新的技能...
测试
public static void main(String[] args)
{
Coder coder=new Coder();
System.out.println(coder.getSalary());
System.out.println(coder.getSkill());
Coder helloworldCoder=new HelloWorldCoder(coder);
System.out.println(helloworldCoder.getSalary());
System.out.println(helloworldCoder.getSkill());
Coder javaCoder=new JavaCoder(helloworldCoder);
System.out.println(javaCoder.getSalary());
System.out.println(javaCoder.getSkill());
// 使用扩展(装饰类特有)的功能
JavaCoder crudCoder= (JavaCoder)javaCoder;
crudCoder.curd();
}
输出
0.0
啥也不会
100.0
啥也不会,会写HelloWorld了
1100.0
啥也不会,会写HelloWorld了,精通Java
会写增删改查了
标签:block 就是 关闭 tor pre 类对象 new 避免 javac
原文地址:https://www.cnblogs.com/lypzzzzz/p/14961140.html