Java装饰器设计模式初探
作者:Michaelwjw 时间:2021-08-17 17:23:46
本篇随笔主要介绍用Java实现简单的装饰器设计模式:
先来看一下装饰器设计模式的类图:
从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰。
下面是用Java实现的简单的装饰器设计模式,提供的是从基本的加入咖啡入手,可以继续加入牛奶,巧克力,糖的装饰器系统。
interface Component {
void method();
}
class Coffee implements Component {
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("倒入咖啡");
}
}
class Decorator implements Component {
public Component comp;
public Decorator(Component comp) {
this.comp = comp;
}
@Override
public void method() {
// TODO Auto-generated method stub
comp.method();
}
}
class ConcreteDecorateA extends Decorator {
public Component comp;
public ConcreteDecorateA(Component comp) {
super(comp);
this.comp = comp;
}
public void method1() {
System.out.println("倒入牛奶");
}
public void method2() {
System.out.println("加入糖 ");
}
public void method() {
super.method();
method1();
method2();
}
}
class ConcreteDecorateB extends Decorator {
public Component comp;
public ConcreteDecorateB(Component comp) {
super(comp);
this.comp = comp;
}
public void method1() {
System.out.println("加入巧克力");
}
public void method() {
super.method();
method1();
}
}
public class TestDecoratePattern {
public static void main(String[] args) {
Component comp = new Coffee();
comp.method();
System.out.println("--------------------------------------------------");
Component comp1 = new ConcreteDecorateA(comp);
comp1.method();
System.out.println("--------------------------------------------------");
Component comp2 = new ConcreteDecorateB(comp1);
comp2.method();
System.out.println("--------------------------------------------------");
Component comp3 = new ConcreteDecorateB(new ConcreteDecorateA(new Coffee()));
comp3.method();
System.out.println("--------------------------------------------------");
Component comp4 = new ConcreteDecorateA(new ConcreteDecorateB(new Coffee()));
comp4.method();
}
}
运行结果:
标签:Java,装饰器模式
0
投稿
猜你喜欢
详解Android自定义控件属性TypedArray以及attrs
2023-06-20 05:13:41
C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例
2023-02-27 11:40:23
c#字符串编码问题的处理解决
2021-07-06 13:47:49
C#调用Win32的API函数--User32.dll
2022-04-13 16:43:24
Android开发笔记之如何正确获取WebView的网页Title
2022-06-04 07:02:41
flutter仿微信底部图标渐变功能的实现代码
2023-08-18 14:31:39
C#中标准的IDispose模式代码详解
2022-03-27 01:40:05
Dynamic和Var的区别及dynamic使用详解
2022-09-22 13:18:23
深入理解Java抽象类
2022-08-15 09:17:12
C#画图之饼图折线图的实现方法
2021-12-05 22:26:13
C++调用C#的DLL程序实现方法
2023-02-04 13:58:16
一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
2022-06-08 16:36:41
java异常处理的简单练习
2023-12-01 02:20:48
Java开发完整短信验证码功能的全过程
2023-05-05 15:35:24
Android Studio实现登录界面功能
2023-06-11 20:27:35
Java 手写LRU缓存淘汰算法
2023-03-03 00:11:19
Flutter投票组件使用方法详解
2022-05-25 19:07:05
Android系统设置中的清除数据会清除哪些数据?
2022-09-04 04:48:13
java的多线程高并发详解
2022-06-28 10:12:06
AnyChat的视频会议程序实例详解
2022-05-12 01:03:43