一、场景:已经有一个接口A,含有方法a1()但是现在需要添加旧类B的方法a1()中添加新的功能,而不想修改B。
二、分析:
直接在类B中添加新的功能方法:
interface A{void a1() };
class B implements A(){
void a(){}//继承的方法
}
class C extends B{
void a1(){
super();
this.c1();//新功能
}
void c1(){
//新功能
}
}
调用:A b=new C(); b.a1();
------->新问题:我要不仅在B中添加方法c1(),还要添加d1()方法,如果在D继续extends C,那么类层次将变的非常多。显然不现实,继续思考:还有其它方法调用B的a1()方法吗?如果C能持有B的对象,那不就可以调用B的方法a1()了?如果继续扩展D,那么D持有C,再扩展E,E持有D...得出结论:C、D、E、F都必须持有A的引用,再加上条件“旧类B的方法a()中添加新的功能”,得出C、D、E、F都必须实现a1()方法。
三、结论:
a.都必须持有A的引用
b.都必须实现a1()方法
根据结论实现:
class C implements A{
private A a;//持有引用
public C(A a){
this.a=a;//传进对象
}
public void a1(){
a.a1();
this.c1();//调用新功能
}
public void c1(){
//新功能
}
}
class D implements A{
private A a;//持有引用
public D(A a){
this.a=a;//传进对象
}
public void a1(){
a.a1();
this.d1();//调用新功能
}
public void d1(){
//新功能
}
}
............................
四、范例:
package Decorator;
interface Person {
void vested();
}
package Decorator;
public class Farmer implements Person{
public Farmer(){
System.out.println("我是农民");
}
public void vested(){
System.out.println("我天生就会穿衣服");
}
}
package Decorator;
class Stocker implements Person {
private Person person;
public Stocker(Person p){
this.person=p;
}
public void vested(){
person.vested();
this.stock();
}
void stock(){
System.out.println("奇了,我能在穿衣服时炒股");
}
}
package Decorator;
public class Barber implements Person {
private Person person;
public Barber(Person p){
this.person=p;
}
public void vested(){
person.vested();
haircut();
}
public void haircut(){
System.out.println("oh,my god ,他让我能穿衣服时还能剪头发");
}
}
public class Test {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) {
// TODO: Add your code here
Person p=new Stocker(new Barber(new Farmer()));
p.vested();
}
}
分享到:
相关推荐
Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...
装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...
装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...
在前端开发中,装饰器模式常用于实现AOP(面向切面编程),比如日志记录、性能监控、权限控制等功能。通过定义装饰器函数,可以在不侵入原代码逻辑的情况下,控制代码的执行流程。例如,可以创建一个`logDecorator`...
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式是一种设计模式,它的核心思想是动态地给一个对象添加一些额外的职责。这种方式提供了一种扩展原有对象功能的方式,而且并不需要修改原有对象的代码,符合开闭原则(对扩展开放,对修改封闭)。 在装饰器...
以上就是"Python装饰器模式学习demo"中涉及的主要内容。通过这个项目,你可以深入理解装饰器的工作原理,以及如何在实际项目中应用它们。实践中,装饰器可用于日志记录、性能测试、权限控制等多种场景,是Python开发...
Ruby中的装饰器模式是一种设计模式,它允许我们动态地向对象添加新的行为或职责,而无需修改原有类的代码。这种模式比继承更加灵活,因为它可以在运行时改变对象的行为,而不是在编译时通过类继承来实现。装饰器模式...
装饰器模式是一种设计模式,它的主要目的是在不修改已有对象的基础上,动态地为对象增加新的功能。这种模式在软件工程中被广泛应用,特别是在需要扩展功能而又不希望改动原有代码的情况下,装饰器模式提供了很好的...
30 丨 装饰器模式:如何优化电商系统中复杂的商品价格策略?.html
Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...
装饰器模式是一种设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。这种模式是面向对象设计中用于扩展功能的一种灵活方式,它遵循“开闭原则”,即对扩展开放,对修改关闭。在Python等...
装饰器模式、原型模式和享元模式是软件设计模式中的三种重要模式,它们在实际项目开发中被广泛应用,以提高系统的性能和可维护性。下面将详细解释这三种设计模式的概念、应用场景及其实现方式。 **装饰器模式...
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...
装饰器模式允许在不修改对象现有代码的情况下,动态地为对象添加职责。它通过提供一种将对象“包裹”在具有类似接口的对象中的方式来实现这一点,增强了Java设计模式的灵活性。 ## 二、详细解释及实际示例 1. **...
装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的功能。这种模式常用于在运行时改变或扩展对象的行为,而无需改变其源代码。装饰器模式的核心思想是通过将对象包装在一个装饰类...
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...
装饰器模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改原有类的代码。这种模式通过创建包装对象(即装饰器)来包裹原对象,装饰器对象拥有与原对象相同的接口,因此可以在不改变...
【装饰器模式】是一种设计模式,它允许向现有的对象添加新的功能,同时又不改变其原有结构。在Java IO类库中,装饰器模式被广泛使用,以灵活地扩展类的功能,而避免了使用继承带来的复杂性。装饰器模式的核心在于,...