您的当前位置:首页正文

java装饰者模式怎么用?

2024-07-17 来源:好兔宠物网

1、使用说明

(1)装饰者模式可以带来比继承更加灵活的扩展功能,使用更加方法,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化的结果。装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任。

(2)装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

2、实例

public class HelloWorld {
    public static void main(String[] args) {
        //点一份炒饭
        FastFood food = new FriedRice();
        //花费的价格
        System.out.println(food.getDesc() + " " + food.cost() + "元");
 
        System.out.println("========");
 
        //点一份加鸡蛋的炒饭
        FastFood food1 = new FriedRice();
        food1 = new Egg(food1);
        //花费的价格
        System.out.println(food1.getDesc() + " " + food1.cost() + "元");
 
        System.out.println("========");
 
        //点一份加培根的炒面
        FastFood food2 = new FriedNoodles();
        food2 = new Bacon(food2);
        //花费的价格
        System.out.println(food2.getDesc() + " " + food2.cost() + "元");
    }
}
 
// 快餐抽象类
abstract class FastFood {
    private float price;
    private String desc;
 
    public FastFood() {}
 
    public FastFood(float price, String desc) {
        this.price = price;
        this.desc = desc;
    }
 
    public float getPrice() {
        return price;
    }
 
    public void setPrice(float price) {
        this.price = price;
    }
 
    public String getDesc() {
        return desc;
    }
 
    public void setDesc(String desc) {
        this.desc = desc;
    }
 
    // 获取价格
    public abstract float cost();
}
 
// 炒饭
class FriedRice extends FastFood {
    public FriedRice() {
        super(10, "炒饭");
    }
 
    @Override
    public float cost() {
        return getPrice();
    }
}
 
// 炒面
class FriedNoodles extends FastFood {
    public FriedNoodles() {
        super(12, "炒面");
    }
 
    @Override
    public float cost() {
        return getPrice();
    }
}
 
// 配料
abstract class Garnish extends FastFood {
    private FastFood fastFood;
 
    public FastFood getFastFood() {
        return fastFood;
    }
 
    public void setFastFood(FastFood fastFood) {
        this.fastFood = fastFood;
    }
 
    public Garnish(FastFood fastFood, float price, String desc) {
        super(price, desc);
        this.fastFood = fastFood;
    }
}
 
// 鸡蛋配料
class Egg extends Garnish {
    public Egg(FastFood fastFood) {
        super(fastFood, 1, "鸡蛋");
    }
 
    @Override
    public float cost() {
        return getPrice() + getFastFood().getPrice();
    }
 
    @Override
    public String getDesc() {
        return super.getDesc() + getFastFood().getDesc();
    }
}
 
//培根配料
class Bacon extends Garnish {
    public Bacon(FastFood fastFood) {
        super(fastFood,2,"培根");
    }
 
    @Override
    public float cost() {
        return getPrice() + getFastFood().getPrice();
    }
 
    @Override
    public String getDesc() {
        return super.getDesc() + getFastFood().getDesc();
    }
}

以上java装饰者模式的用法,希望能对大家有所帮助。更多Java学习指路:

好兔宠物网还为您提供以下相关内容希望对您有帮助:

java io流涉及到了哪些设计模式

Java IO流是一个很好地应用装饰者模式的例子。在Java IO库中,你可以看到InputStream、OutputStream、Reader和Writer等基类,这些基类定义了基本的读写操作。然后,有许多的具体子类,如BufferedInputStream、ObjectInputStream等,这些子类都增加了不同的功能。同时,这些子类都是通过装饰者模式,在运行时动态添...

java的装饰者模式中装饰类为什么不直接实现接口

具体构件角色(Employe):定义一个将要接收附加责任的类 装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口 具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任 二、下面通过一个软件项目例子来说明装饰模式的使用 过程是这样的:项目经理接到一个项目...

javaio流中涉及到了哪些设计模式

装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者模提供了比继承更有弹性的替代方案。通俗的解释:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。适配器模式:将一个类的接口,转换成客户期望的另一个接口。

Java程序性能优化-装饰者模式(4)

装饰者模式( )系统的核心类 它实现了向文件写入数据 使用DataOutputStream可以在FileOutputStream的基础上 增加对多种数据类型的写操作支持 而BufferedOutputStream装饰器 可以对FileOutputStream增加缓冲功能 优化I/O的性能 以BufferedOutputStream为代表的性能组件 是将性能模块和功能模块分离的一种典型实现 ...

java decaf

首先装饰者模式是动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。我们要以饮料为主体,然后在运行时以调料来“装饰”(decorate)饮料。比方说,如果顾客想要摩卡和奶泡深焙咖啡,那么,要做的是:1、拿一个深焙咖啡(DarkRoast)对象 2、以摩卡(Mocha)对象装饰它 ...

Java 代理模式和装饰者模式的区别

IO的设计即是装饰者模式的典型应用。代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等。

java中装饰模式,装饰类和被装饰类要实现同一个接口,为什么?怎么理解呢...

其二是装饰者和被装饰者必须达到类型匹配,这样他们才能组合在一起,然后共同去描述和修饰某一事物。装饰者模式,在java jdk中典型的应用是io流:被装饰者FileInputStream和装饰者FilterInputStream都是继承自InputStream。我把他们的类图给你黏贴出来:回答满意的话给最佳噢~

java中常用的设计模式有哪些?

您好:java中的设计模式有23种,具体如下:创建型 抽象工厂模式、工厂方法、建造者模式、原型模式、单态模式 结构型 适配器模式、桥接模式、组合模式、外观模式、装饰者模式、享元模式、代理模式、行为型 责任链模式、命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、观察者模式、状态模式、策略...

1. 装饰器模式解决了软件设计的什么问题? 有什么优点? 请举例说明该设 ...

(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。然而,装饰者模式,不需要子类可以在应用程序运行时,动态扩展功能,更加方便、灵活。适用装饰者模式场合...

java设计模式都有哪些(java的设计模式有哪些)

装饰者模式(DecoratorPattern)外观模式(FacadePattern)享元模式(FlyweightPattern)代理模式(ProxyPattern)行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:责任链模式(ChainofPattern)命令模式(CommandPattern)解释器模式(InterpreterPattern)迭代器模式(IteratorPattern)...