简介:装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
装饰器模式可以少写很多复杂的逻辑,复杂的逻辑直接调用被装饰者的方法。
装饰器模式一般需要共同实现一个接口或者继承一个类,装饰者和被装饰者共同的方法,方法名一般要保持统一。
在java 装饰器模式比较典型的例子有:被装饰者FileInputStream和装饰者FilterInputStream都是继承自InputStream。
比如自定义数据库连接池,除了可以扩展某些功能之外,大部分的功能仍然使用jdk中提供的数据库连接池的方法即可,这样避免了繁琐重复的代码。
//定义一个接口:哺乳动物
public interface Mammal {
public void suckle();//哺乳
public void vivipation();//胎生
public void run();//奔跑
}
/**
* 老鼠(被装饰者),典型的哺乳动物,具有哺乳动物的所有特性
*/
class Mouse implements Mammal{
@Override
public void suckle() {
System.out.println("刚出生就需要哺乳");
}
@Override
public void vivipation() {
System.out.println("胎生");
}
@Override
public void run() {
System.out.println("可以在大地上奔跑");
}
}
/**
*蝙蝠(装饰者),也是哺乳动物。胎生,哺乳,奔跑这些动作其他哺乳动物都有,直接拿过来用就行,没必要再重新写一遍
*(当这些共同的方法逻辑比较复杂时,这种模式更加实用)
*/
class Bat implements Mammal{
private Mouse mouse;
public Bat(Mouse mouse) {
super();
this.mouse = mouse;
}
public Bat(){
this.mouse=new Mouse();
}
@Override
public void suckle() {
mouse.suckle();
}
@Override
public void vivipation() {
mouse.vivipation();
}
@Override
public void run() {
mouse.run();
}
public void fly(){
System.out.println("可以飞翔");
}
}
主方法:
public class Main {
public static void main(String[] args) {
Mouse mouse =new Mouse();
Bat bat=new Bat();
bat.fly();
bat.run();
bat.vivipation();
bat.suckle();
}
}
运行结果:
可以飞翔
可以在大地上奔跑
胎生
刚出生就需要哺乳