23种设计模式+额外常用设计模式汇总 (持续更新)
装饰模式(Decorator):又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式常常被称为包裹模式,就是因为每一个具体装饰类都将下一个具体装饰类或者具体构成类包裹起来。
Decorator链
Decorator1->Decorator2->Decorator3->Concrete Comp
功能 能够实现动态地为对象添加功能,是从一个对象外部来给对象增加功能,相当一是改变了对象的外观
对象组合 Favor Composition Over Inheritance
装饰器和组件类的关系 装饰器是用来装饰组件类的关系,装饰器一定要实现和组件类一致的接口,保证他们是同一个类型,并且具有同一个外观这样组合完成的装饰才能够递归调用下去。
本质 动态是手段,组合是目的
会产生很多细粒度对象
//抽象构件(Component)角色
public abstract class Component {
public abstract void operate();
//具体构件(ConcreteComponent)角色,被包装对象
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("ConcreteComponent 原始对象操作");
}
}
// 装饰(Decorator)角色:
public abstract class Decorator extends Component {
private Component component;
/**
* 构造函数传递要装饰的对象
* @param component 被装饰的对象
*/
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
//调用被装饰者的方法
this.component.operate();
}
}
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
//调用自己的方法
this.operateAMethod();
}
private void operateAMethod() {
System.out.println("ConcreteDecoratorA添加的修饰方法");
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operate() {
//调用自己的方法
this.operateBMethod();
super.operate();
}
private void operateBMethod() {
System.out.println("ConcreteDecoratorB添加的修饰方法");
}
}
public class Client {
public static void main(String[] args) {
//创建原始对象
Component component = new ConcreteComponent();
//第一次装饰
component = new ConcreteDecoratorA(component);
//第二次装饰
component = new ConcreteDecoratorB(component);
//两次装饰后的操作
component.operate();
}
}
【问题】 一个人可以搭配不同的服饰:例如,大T恤,垮裤,破球鞋;或者,西装,领带,皮鞋。 【装饰模式实现代码】
using System;
namespace Wear
{
abstract class Component
{
public abstract void Show();
}
class Person: Component
{
private String name;
public Person() { }
public Person(String name)
{
this.name = name;
}
public override void Show()
{
Console.WriteLine("装饰的{0}", name);
}
}
class Finery : Component
{
protected Component component;
public Finery(Component component)
{
this.component = component;
}
public override void Show()
{
if(component!=null)
{
component.Show();
}
}
}
class Tshirt:Finery
{
public Tshirt(Component component) : base(component) { }
public override void Show()
{
Console.Write("大T恤 ");
base.Show();
}
}
class BigTrouser : Finery
{
public BigTrouser(Component component) : base(component) { }
public override void Show()
{
Console.Write("垮裤 ");
base.Show();
}
}
class Sneakers : Finery
{
public Sneakers(Component component) : base(component) { }
public override void Show()
{
Console.Write("破球鞋 ");
base.Show();
}
}
class Suit : Finery
{
public Suit(Component component) : base(component) { }
public override void Show()
{
Console.Write("西装 ");
base.Show();
}
}
class Tie : Finery
{
public Tie(Component component) : base(component) { }
public override void Show()
{
Console.Write("领带 ");
base.Show();
}
}
class LeatherShoes : Finery
{
public LeatherShoes(Component component) : base(component) { }
public override void Show()
{
Console.Write("皮鞋 ");
base.Show();
}
}
class Program
{
static void Main(string[] args)
{
Person xc = new Person("小菜");
Console.WriteLine("第一种装扮");
Finery dtx = new Tshirt(new BigTrouser(new Sneakers(xc)));
dtx.Show();
Console.WriteLine("第二种装扮");
Finery sut = new Suit(new Tie(new LeatherShoes(xc)));
sut.Show();
}
}
}
【UML图】