欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第八章 装饰模式 博客分类: Java基础Java设计模式 装饰模式java模式 

程序员文章站 2024-03-24 21:21:52
...

1.装饰模式

动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。

动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。

在装饰模式中,“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。
2装饰模式-结构

装饰模式的结构中包括四种角色:

  •  抽象组件(Component)
  • 具体组件(ConcreteComponent) 
  •  装饰(Decorator) 
  •  具体装饰(ConcreteDecotator)


第八章 装饰模式
            
    
    博客分类: Java基础Java设计模式 装饰模式java模式 
 装饰模式的核心就是在于装饰的构造方法关联了抽象组件的引用,而具体组件和具体装饰都是属于抽象组件的子类,所以在构造具体装饰的时候,可以把不同的具体装饰作为引用来构造自己,即实现责任的扩充。

3装饰模式-场景描述

麻雀可以在飞100米的基础上连续飞50米

4装饰模式-场景分析

 

  • 抽象组件
    鸟 Bird
  • 具体组件
    麻雀 Sparrow
  • 装饰
    装饰 Decorator
  • 具体装饰
    具体装饰 SparrowDecorator


第八章 装饰模式
            
    
    博客分类: Java基础Java设计模式 装饰模式java模式 
 5装饰模式-代码实现

package patterns.decorator;
/**
 * 抽象组件
 * @author Administrator
 *
 */
public abstract class Bird {
	public abstract double fly();
}

package patterns.decorator;
/**
 * 具体组件
 * @author Administrator
 *
 */
public class Sparrow extends Bird {

	@Override
	public double fly() {
		return 100;
	}

}


package patterns.decorator;
/**
 * 装饰角色
 * @author Administrator
 *
 */
public abstract class Decorator extends Bird {
	public Bird bird;

	public Decorator(Bird bird) {
		this.bird = bird;
	}
}


package patterns.decorator;
/**
 * 具体装饰角色
 * @author Administrator
 *
 */
public class SparrowDecorator extends Decorator {
	public double DISTANCE = 50;
	public SparrowDecorator(Bird bird) {
		super(bird);
	}

	@Override
	public double fly() {
		return bird.fly()+DISTANCE;
	}

}


package patterns.decorator;

public class Client {
	public static void main(String[] args) {
		Bird bird = new Sparrow();
		System.out.println(bird.fly());
		
		Decorator decorator = new SparrowDecorator(bird);
		System.out.println(decorator.fly());
		
		Decorator decorator2 = new SparrowDecorator(decorator);
		System.out.println(decorator2.fly());
	}
}

 

  • 第八章 装饰模式
            
    
    博客分类: Java基础Java设计模式 装饰模式java模式 
  • 大小: 41 KB
  • 第八章 装饰模式
            
    
    博客分类: Java基础Java设计模式 装饰模式java模式 
  • 大小: 16 KB