装饰者设计模式 通俗易懂

精选30+云产品,助力企业轻松上云!>>> hot3.png

1.1    简述及实现原则

装饰模式:在不改变 原有类 和 不使用继承的情况下, 动态地扩展一个对象的功能。

因会创建一个包装对象,来包裹真实对象而得名。

作用:增强对象的功能

例子1:

墙: 功能---遮风挡雨

  包了墙纸的墙(本质还是墙):

        原功能---遮风挡雨

        新增功能---陶冶情操

        1、没有改变原有类

        2、进行动态地增强

装饰类:增强功能的类(包了墙纸的墙)

被装饰类:待增强功能的类(墙)

实现原则

1、 装饰类必须实现被装饰类的所有接口

2、装饰类中必须获取被装饰类对象

1.2   案例演示

准备代码

Phone接口:

public interface Phone {
   void call(String number);
   void sendMsg();
}

HWPhone实现类:

public class HWPhone implements Phone {
   public void call(String number) {
     System.out.println("拨打电话:"+number);
   }
   public void sendMsg() {
     System.out.println("发送短信");
   }
}

分析:

1、定义一个装饰类 实现 Phone接口

2、装饰类中 获取到 被装饰类对象(成员变量)

代码实现:

HWPhoneDecorator:

public class HWPhoneDecorator implements Phone {
    //被装饰类的对象
    private HWPhone old;
    public HWPhoneDecorator(HWPhone old) {
        this.old = old;
    }
    /*
    * 打电话方法不需要增强,不需要改变
    * */
    public void call(String number) {
        old.call(number);
    }
    /**
     * 发短信方法需要被增强
     */
    public void sendMsg() {
        //1、先运行原来的功能
        old.sendMsg();
        //2、再执行新的增强代码
        System.out.println("(o゜▽゜)o☆[BINGO!]");
    }
}

测试类:

public static void main(String[] args) {
    Phone hw = new HWPhoneDecorator(new HWPhone());
    hw.call("12345");
    hw.sendMsg();
}

未使用装饰者设计模式效果

拨打电话:12345

发送短信

使用装饰者设计模式效果

拨打电话:12345

发送短信

(o゜▽゜)o☆[BINGO!]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Java设计模式,常见的有23种,其中比较常用的包括单例模式、工厂模式、观察者模式等等。这里举个例子来说明一下工厂模式的应用。 工厂模式是用来创建对象的一种模式,它提供了一种创建对象的最佳方式。例如,我们有一个工厂类,它有一个方法可以根据传入的参数来创建不同的对象,这样我们就可以将对象的创建逻辑从客户端代码中分离出来。下面是一个简单的例子: 我们有一个披萨店,它可以制作不同种类的披萨,比如意大利披萨、希腊披萨、墨西哥披萨等等。我们可以创建一个工厂类,它有一个方法可以根据传入的参数来创建不同种类的披萨对象。客户端代码只需要调用工厂方法即可获得所需的披萨对象,而不需要关心具体的创建过程。 具体实现可以参考以下代码: 首先,我们定义一个抽象的Pizza类,它包含了一些公共的方法,比如getName()和prepare()等: public abstract class Pizza { protected String name; public abstract void prepare(); public String getName() { return name; } } 然后,我们定义不同种类的Pizza类,比如意大利披萨、希腊披萨和墨西哥披萨等: public class ItalianPizza extends Pizza { public ItalianPizza() { name = "意大利披萨"; } public void prepare() { System.out.println("准备意大利披萨的材料"); } } public class GreekPizza extends Pizza { public GreekPizza() { name = "希腊披萨"; } public void prepare() { System.out.println("准备希腊披萨的材料"); } } public class MexicanPizza extends Pizza { public MexicanPizza() { name = "墨西哥披萨"; } public void prepare() { System.out.println("准备墨西哥披萨的材料"); } } 最后,我们创建一个工厂类,它有一个方法可以根据传入的参数来创建不同种类的Pizza对象: public class PizzaFactory { public Pizza createPizza(String type) { if (type.equals("Italian")) { return new ItalianPizza(); } else if (type.equals("Greek")) { return new GreekPizza(); } else if (type.equals("Mexican")) { return new MexicanPizza(); } else { return null; } } } 客户端代码可以这样调用工厂方法来获得所需的Pizza对象: PizzaFactory factory = new PizzaFactory(); Pizza pizza1 = factory.createPizza("Italian"); Pizza pizza2 = factory.createPizza("Greek"); Pizza pizza3 = factory.createPizza("Mexican"); 通过工厂模式,我们可以将对象的创建过程抽象出来,使客户端代码更加清晰简洁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值