面向对象通过继承,可是使我们扩展已有类的功能。所以在面向对象的开发中一遇到这种情况(原有类的功能不能满足要求或者要在原有类的基础上扩展一些额外的功能),通常的想法就是通过继承方法来实现现有类的额外功能。这种方法通常是可行的,但是有时却是不合适的。
当我们想改变一个已经初始化对象的行为,我们不能通过继承方法来实现这个功能;当我们想对一族子类(从同一个父类继承而来)扩展类似的功能。我们可以通过继承来时实现,但是这样就会来带更多的子类而这有时候会带来子类爆炸。
我们该如何组织我们的代码使其可以容易的添加基本的或者一些很少用到的特性,而不是直接把额外的代码写在类的内部?
对上述问题很适合的解决方案就是装饰器模式。装饰器模式能实现动态的改变子类的行为或添加子类特性。
假如我们有一个TextInput类,类中有一个paint功能(渲染出文本输入框让用户输入)。一开始这个类的paint功能只是简单的输出输入框。现在我们要增加paint的功能,在输出输入框的同时在输入框的左边同时显示一个提示label(提示这个输入框应该输入什么内容比如:名字还是E- mail),我们可以再写一个TestInputWithLabel类继承自TextInput类然后重载paint功能。然而当我们再要实现一个功能:当TextInput控件中输入的内容不符合要求的时候,他的显示样式就要显示成具有提示你输入的数据是错误的Label+TextInput,这时我们又增加一个InvalidTextInputWithLabel类。。。这样子类数量将变的更多而且如果其他的控件也以这样的形式来处理问题的话,那子类的数量将变得可想而知了。
而用装饰模式的话我们可以生成一个容器类,用来容纳要处理的控件对象。而且这个容器拥有将要处理对象一样的功能接口函数paint。这样我们在容器装载不同的对象的后,条用同样功能paint将更具包含的不同对象就行特殊功能。
装饰器模式
最新推荐文章于 2024-05-03 00:09:42 发布