大话设计模式中的装饰模式

 

看到这一节我才知道,这本书语言原来是用的C#,之前完全靠着以前C++知识来理解的。所以base关键字那里着实不好理解。

不过装饰模式我还是喜欢python的装饰器,人生苦短,我用python。

python版

def addafunction(fu):
	print("I have a pen")
	print("I have an apple")
	return fu
	
@addafunction
def main():
	print("A~ applepen")
	
main()

'''
结果
I have a pen
I have an apple
A~ applepen
'''

通过一个@符号告诉下面的那个函数,在你执行之前,我添加点东西。

在不修改原函数的条件下,增加新功能

java版

public class Example {
    public static void main(String[] args){
        PPAP ppap = new PPAP();
        Pen pen = new Pen();
        Apple apple = new Apple();
        pen.decorator(ppap);
        apple.decorator(pen);
        apple.print();
    }
}

class PPAP{
	public void print(){
		System.out.println("A~ applepen");
	}
}

class PPAPDecorator extends PPAP{
    PPAP ppap;
    public void decorator(PPAP ppap){
        this.ppap = ppap;
    }
    public void print(){
        ppap.print();
    }
}

class Pen extends PPAPDecorator{
    public void print(){
        System.out.println("I have a pen");
        ppap.print();
    }
}

class Apple extends PPAPDecorator{
    public void print(){
        System.out.println("I have an apple");
        ppap.print();
    }
}

/*
结果
I have an apple
I have a pen
A~ applepen
*/

其实那个PPAPDecorator类的内容卸载PPAP类也行,原理一样的。

public class Example{
    public static void main(String[] args){
        PPAP ppap = new PPAP();
        Pen pen = new Pen();
        Apple apple = new Apple();
        pen.decorator(ppap);
        apple.decorator(pen);
        apple.print();
    }
}


class PPAP{
    PPAP ppap;
    public void decorator(PPAP ppap){
        this.ppap = ppap;
    }
	public void print(){
		System.out.println("A~ applepen");
	}
}

class Pen extends PPAP{
    public void print(){
        System.out.println("I have a pen");
        ppap.print();
    }
}

class Apple extends PPAP{
    public void print(){
        System.out.println("I have an apple");
        ppap.print();
    }
}

/*
结果
I have an apple
I have a pen
A~ applepen
*/

在《大话设计模式》中服饰类定义

class TShirts : Finery
{
    public override void Show()
    {
        Console.Write("大T恤");
        base.Show();
    }
}

文中 base.Show() 可以写成component.Show()。

文中base指的是基类Person。component对象的类型也是Person类,所以在base.Show() ==  component.Show()。至于Show()方法的内容就是多态的事了。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页