目前有这么个场景:三个继承关系Father,Son,GrandSon三个类,我要再Son类上增强一些功能怎么办?我想项目过程中,如果你是后来者,那么你免不了修改别人的代码。如果初期你对那些代码不知所云,但目前又急需修改功能,难道你真决定在Son类上大动手脚,我想你没那么牛叉,至少我对那些功能点的修改就有点畏首畏尾,毕竟前期代码不是我写,稍微修改,意想不到的错误无法预料。不允许,对了,为什么呢?你增强的功能是修改Son类中的方法吗?增加方法吗 ?对GrandSon的影响哪?如果GrandSon有多个的情况,你怎么办?这个评估的工作量就是够你受的,所以这个是不允许的,那还是要解决问题的呀,怎么办?这里就可以用着装饰模式了。
装饰模式主要用于对已有功能动态地添加功能的一种方式。通过对对象进行包装,使得装饰对象的实现和对象进行分离,从而装饰对象只需要关心自己的功能,而不需要关心如何添加到对象链中。这样做就是为了有效地把类的核心职责和装饰功能区分开来,但要注意地是,装饰模式的顺序非常重要。下面就用代码对上面场景进行模拟:
类Father:
/**
* @author lw 父亲类方法有a 、b 、c三种方法,其中c是抽象方法。
*/
public abstract class Father {
public void a() {
System.out.println("Father a函数!");
};
public void b() {
System.out.println("Father b函数!");
};
public abstract void c();
}
类Father:
/**
* @author lw
* 儿子继承父亲,重写父亲的抽象方法c
*/
public class Son1 extends Father {
@Override
public void c() {
System.out.println("Son1 C函数重写!");
}
@Override
public void b() { //需要对b的方法进行扩展
System.out.println("override
Son1's b function()");
}
}
在这里GrandSon1的代码就不做模拟,假设Son1的b方法进行修改,将影响到其子类的功能实现。此时需要对Son1的b方法功能进行扩展,其中扩展的功能代码是核心代码,所以我把它先拿到外面搁置起来,并对其进行装饰。
装饰类Decorator:
public abstract class Decorator extends Father{
private Father father;
protected Decorator(Father father){
this.father=father;
}
public void b(){
if(father!=null){
father.b();
}
}
@Override
public void c() {
System.out.println("重写C函数");
}
}
类Decorator1Impl:
public class Decorator1Impl extends Decorator{
public Decorator1Impl(Father father){
super(father);
}
public void b(){
super.b();
System.out.println("装饰模式下的b 1方法");
}
}
类Decorator2Impl:
public class Decorator2Impl extends Decorator{
public Decorator2Impl(Father father){
super(father);
}
public void b(){
super.b();
System.out.println("装饰模式下的b 2方法");
}
}
调用类:
public class Client {
public static void main(String[] args) {
Father f;
f = new Son1();
Father f1=new Decorator1Impl(f);
Father f2=new Decorator2Impl(f1);
f2.b();
}
}
运行的结果为:
override Son1's b function()
装饰模式下的b 1方法
装饰模式下的b 2方法
如果某一天,你觉得这个调用顺序需要更改,到时只需要更改装饰模式下的接口实现就能完成程序的扩展。或者某天你需要继续对该功能进行扩充,到时只需要继续写接口实现类即可。但是对于装饰模式千万要注意其顺序。
装饰模式是对继承的有力补充。在项目开发实施过程中,将要考虑系统的易维护、易扩展、易复用等情况,但继承是静态地给类增加功能,如果用继承解决的话,将会增加很多类,灵活性也会变差。而装饰模式有非常好的优点,扩展性比较好。在系统开发过程中,需求的变更我想这是永远也改变不了的现实,装饰模式可以提供很好的帮助。通过重新封装一个类,而不是通过继承去实现,这样对原程序没有变更,但通过扩充很好地完成了功能的增强。
- 大小: 12.7 KB
分享到:
相关推荐
"装饰者模式-概念图.pdf"可能会展示装饰者模式的层次结构和组件之间的关系,帮助我们直观地理解各个角色的职责。"装饰者模式-类图.pdf"则可能包含更详细的类图,显示了类与类之间的继承和关联关系,有助于深入学习和...
装饰模式是一种结构型设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改该对象...通过学习这些示例,你可以更深入地理解如何在C#中实现和应用装饰模式,以便在自己的项目中有效地利用这一设计模式。
装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在软件工程中非常常见,因为它提供...这个C++实例将有助于理解装饰模式的工作原理及其在软件设计中的价值。
装饰模式是一种设计模式,它允许我们在不修改原有对象的基础上,通过添加新的行为或属性来扩展对象的功能。在"装饰模式小猪快跑...这个例子可以帮助我们更好地理解和掌握装饰模式的精髓,并在自己的项目中灵活运用。
总结来说,学习C#中的装饰模式将帮助你更好地理解和利用面向对象的设计原则,如开闭原则(对扩展开放,对修改关闭)。通过实践这些知识点,你可以写出更灵活、可维护的代码,同时避免过度使用继承导致的复杂性。无论...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来...通过以上示例和解释,我们可以更好地理解和应用装饰者模式。
7. **学习路径**:理解装饰模式的基本概念后,可以通过阅读代码示例来了解如何创建装饰类和如何使用它们。然后,可以尝试自己设计一个装饰模式的实例,加深理解和应用。 8. **文档**:压缩包中的文档可能会详细解释...
总结来说,"实验九:装饰模式.rar"中的示例旨在帮助学习者理解装饰模式的基本概念和用法,通过小猪游戏、肖像画装饰和咖啡茶定制这三个具体的场景,展示了如何在实际应用中灵活运用装饰模式,以实现代码的扩展性和可...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的...通过理解并熟练运用装饰模式,开发者可以在设计复杂的软件系统时更加游刃有余,提高代码的可扩展性和可维护性。
装饰模式是一种设计模式,它允许我们在不改变对象本身的情况下,为对象添加新的行为或属性,从而扩展其功能。这种模式遵循“开闭原则”,即对...在实践中,理解并熟练运用装饰模式,能够提高软件的可维护性和可扩展性。
装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式通常用于保持对象的原始类结构不变,同时增强其功能。HeadFirst 设计模式系列书籍以其生动有趣的插图和...
首先,我们需要理解装饰模式的基本结构。装饰模式通常包含三个主要组件:Component(组件)、Concrete Component(具体组件)和Decorator(装饰器)。Component是定义接口的抽象类,Concrete Component是实现了...
在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定情境下解决常见问题的最佳实践。本文将深入探讨“装饰模式”这一...如果你对Java编程和设计模式感兴趣,深入理解并实践装饰模式无疑会提升你的编程技能。
Java IO 与 装饰模式 在Java编程中,输入输出(IO)处理是程序设计中的重要组成部分,用于读取、写入和处理数据。...通过深入理解装饰模式,我们可以更好地利用Java IO库,优化我们的程序性能和代码结构。
首先,我们要理解装饰者模式的基本构成。在装饰者模式中,有四个主要角色: 1. 抽象组件(Component):定义了被装饰对象的接口,这样任何装饰者都可以与组件的客户端代码一起工作,而无需知道具体的实现细节。 2....
让我们先从Python开始,通过`Decorator.py`文件中的示例来理解装饰模式。 在Python中,装饰器是一种特殊类型的函数,可以用来修改其他函数的功能或行为。装饰器函数接收一个函数作为参数,并返回一个新的函数。以下...
在阅读这篇博客和解压后的“decorator”文件后,你可以深入理解装饰者模式的实现细节,学习如何在自己的项目中运用这一模式,以更优雅的方式扩展功能,同时避免过度使用继承导致的类爆炸问题。通过实践和理解装饰者...
2. 具体组件(Concrete Component):它是装饰模式的主要目标,是被装饰的对象。它实现了抽象组件接口,提供了一套基本的行为和属性。 3. 装饰器(Decorator):装饰器类持有一个抽象组件类型的引用,并实现相同的...
装饰模式是一种结构型设计模式,它允许在运行时为对象添加新的行为或责任,而...通过分析和理解这个Demo,我们可以更好地掌握装饰模式的概念,从而在面对需要动态扩展对象功能的场景时,能更灵活地运用这种设计模式。