[新增功能](master): 更新了一些设计模式的代码

1. 状态,访问者,责任链模式
2. 装饰者,适配器,享元,组合模式

-

ps : 组合模式还需要进一步学习下
master
土豆兄弟 3 years ago
parent 9bfea90f0b
commit ee0e9609f7

@ -0,0 +1,46 @@
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

@ -0,0 +1,214 @@
## 设计模式
### 7大设计原则
开闭原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特原则
里氏替换原则
合成复用原则
### 设计模式 - 创建型模式
工厂模式,抽象工厂模式,建造者模式,单例模式,原型模式
### 设计模式 - 结构型模式
适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式
### 设计模式 - 行为型模式
策略模式,观察者模式,责任链模式,备忘录模式,模板方法模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式,状态模式
### UML类图
- 记忆技巧
- 箭头方向 子类指向父类
- 实线继承 | 虚线实现(空心箭头)
- 实线关联 | 虚线依赖
- 空心菱形-聚合 | 实心菱形-组合
### UML时序图
- 记忆技巧
- 实心箭头-同步调用
- 线箭头-异步调用
- 虚线箭头-返回
### UML类图讲解
### 软件设计七大原则
---
### 装饰者模式
#### 1 定义与类型
定义: 在不改变原有对象的基础上,架构功能附加到对象上
提供了比继承更有弹性的替代方案(扩展原有对象功能)
类型:结构型
#### 2 适用场景
扩展一个类的功能或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以再动态的撤销
#### 3 优点
继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
符合开闭原则
#### 4 缺点
会出现更多的代码,更多的类,增加程序的复杂性
动态装饰时,多层装饰时会更复杂
#### 5 相关的设计模式
装饰者模式和代理模式
- 装饰者模式: 关注在一个对象上动态的添加方法
- 代理模式: 关注控制对对象的访问
装饰者模式和适配器模式
- 装饰者模式:装饰者和被装饰者实现相同的接口或装饰者是被装饰者的子类,(也可以退化成半装饰者,装饰者还提供了其他的方法,但是不常用)
- 适配器模式: 适配器和被适配的类有不同的接口,也可能有部分的接口是重合的
#### 6 代码
com.baiye.design.structural.decorator
#### 7 总结
以 Wapper 结尾的可能是装饰者或者适配器模式,具体看结构
---
### 适配器模式
#### 1 定义和类型
定义: 将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以一起工作
类型:结构型
#### 2 适用场景
已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
#### 3 优点
能提高类的透明性和复用性,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序的扩展性
符合开闭原则
#### 4 缺点
适配器模式编写过程需要全面考虑,可能会增加系统的复杂性
增加系统代码可读的难度
#### 5 扩展
对象适配器
类适配器
#### 6 相关的设计模式
适配器和外观模式
- 外观是定义新的接口,适配器是复用一个原有的接口,适配器是让两个接口协同工作,外观是在现有的系统中提供一个访问入口
#### 7 代码
com.baiye.design.structural.adapter
---
### 享元模式
#### 1 定义和类型
定义:提供了减少对象数量从而改善应用所需对象结构的方式
运用共享技术有效地支持大量细粒度的对象
类型: 结构型
#### 2 使用场景
常常应用于系统底层的开发,以便解决系统的性能问题
系统有大量相似对象,需要缓冲池的场景
#### 3 优点
减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
减少内存之外的其他资源占用
#### 4 缺点
关注 内部/外部状态,关注线程安全问题
使系统,程序的逻辑复杂化
#### 5 扩展
内部状态
外部状态
#### 6 相关的设计模式
享元模式和代理模式
享元模式和单例模式
---
### 组合模式
#### 1 定义和类型
定义:将对象组合成树形结构以表示“部分-整体”的层次结构
组合模式使客户端对单个对象和组合对象保持一致的方式处理
类型:结构型
#### 2 适用场景
希望客户端可以忽略组合对象与单个对象的差异时
处理一个树形结构时
#### 3 优点
清除地定义分层次的复杂对象,表示对象的全部或部分层次
让客户端忽略了层次的差异,方便对整个层次结构进行控制
简化客户端代码
符合开闭原则
#### 4 缺点
限制类型时会较为复杂
使设计变得更加抽象
#### 5 组合模式的相关设计模式
组合模式和访问者模式
- 使用访问者模式可以访问组合模式中的递归结构
#### 6 代码
com.baiye.design.structural.composite
---
### 责任链模式
#### 1 定义与类型
为请求创建一个接收此次请求对象的链
类型: 行为型
#### 2 使用场景
一个请求的处理需要多个对象当中的一个或多个协作处理
#### 3 优点
请求的发送者和接收者(请求的处理)解耦
责任链可以动态组合
#### 4 缺点
责任链太长或者处理时间过长,影响性能
责任链有可能过多
#### 5 相关的设计模式
责任链模式和状态模式
- 责任链模式不指定下一个处理的对象
- 状态模式是知道自己处理的下一个对象是谁
#### 6 代码
com.baiye.design.behavioral.chainofresponsibility
#### 7 总结
责任链 -> 流程引擎
一般责任链模式的都以Chain结尾
---
### 访问者模式
#### 1 定义与类型
封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
可以在不改变各元素类的前提下,定义作用于这些元素的操作
类型:行为型
#### 2 适用场景
当一个数据结构(List/Set/Map等)包含很多类型对象
数据结构与数据操作分离
#### 3 优点
增加新的操作很容易,即增加一个新的访问者
#### 4 缺点
增加新的数据结构困难
具体元素的变更比较麻烦
#### 5 相关设计模式
访问者模式和迭代器模式
- 都是在某种数据结构上进行处理
- 访问者模式在对保存在数据结构中的元素进行某种特定处理
- 迭代器模式是逐步遍历保存在数据结构中的元素
#### 6 coding
com.baiye.design.behavioral.visitor
#### 7 总结
不同角色的人对数据的访问不同
一般以Visitor结尾的各种类
---
### 状态模式
#### 1 定义与类型
允许一个对象在其内部状态改变时,改变他的行为
类型: 行为型
#### 2 使用场景
一个对象存在多个状态(不同状态下行为不同),且状态可相互转换
#### 3 优点
将不同的状态隔离
把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
增加新的状态非常简单
#### 4 缺点
状态多的业务场景导致类的数目增加,系统变复杂
#### 5 相关的设计模式
状态模式和享元模式
- 使用享元模式在多个状态上下文中共享这个模式
#### 6 coding
com.baiye.design.behavioral.state
#### 7 总结
多个状态 -> 状态模式解决 -> 借助 状态机 解决

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dev-protocol</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dev-protocol-design-pattern</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>

@ -0,0 +1,18 @@
package com.baiye.design.behavioral.chainofresponsibility;
public abstract class Approver {
/**
*
*/
protected Approver approver;
public void setNextApprover(Approver approver) {
this.approver = approver;
}
/**
*
*/
public abstract void deploy(Course course);
}

@ -0,0 +1,17 @@
package com.baiye.design.behavioral.chainofresponsibility;
public class ArticleApprover extends Approver{
@Override
public void deploy(Course course) {
if (course.getArticle() != null && !"".equals(course.getArticle())){
System.out.println(course.getName() + "含有手记,批准");
if (null != approver){
approver.deploy(course);
}
}else {
System.out.println(course.getName() + "不包含手记,不批准,流程结束!");
return;
}
}
}

@ -0,0 +1,43 @@
package com.baiye.design.behavioral.chainofresponsibility;
public class Course {
private String name;
private String article;
private String video;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public String getVideo() {
return video;
}
public void setVideo(String video) {
this.video = video;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", article='" + article + '\'' +
", video='" + video + '\'' +
'}';
}
}

@ -0,0 +1,20 @@
package com.baiye.design.behavioral.chainofresponsibility;
public class Test {
public static void main(String[] args) {
Approver articleApprover = new ArticleApprover();
Approver videoApprover = new VideoApprover();
Course course = new Course();
course.setName("Java设计模式精讲");
// course.setArticle("Java设计模式精讲的手记");
course.setVideo("Java设计模式精讲的视频");
// 顺序交给客户端进行处理
// 设置下一个审核人
articleApprover.setNextApprover(videoApprover);
// 发布课程
articleApprover.deploy(course);
}
}

@ -0,0 +1,16 @@
package com.baiye.design.behavioral.chainofresponsibility;
public class VideoApprover extends Approver{
@Override
public void deploy(Course course) {
if (course.getVideo() != null && !"".equals(course.getVideo())){
System.out.println(course.getName() + "含有视频,批准");
if (null != approver){
approver.deploy(course);
}
}else {
System.out.println(course.getName() + "不包含视频,不批准,流程结束!");
return;
}
}
}

@ -0,0 +1,37 @@
package com.baiye.design.behavioral.state;
public class CourseVideoContext {
/**
*
*/
private CourseVideoState courseVideoState;
public static final PlayState PLAY_STATE = new PlayState();
public static final PauseState PAUSE_STATE = new PauseState();
public static final SpeedState SPEED_STATE = new SpeedState();
public static final StopState STOP_STATE = new StopState();
public CourseVideoState getCourseVideoState() {
return courseVideoState;
}
public void setCourseVideoState(CourseVideoState courseVideoState) {
this.courseVideoState = courseVideoState;
// 设置上下文
this.courseVideoState.setCourseVideoContext(this);
}
public void play(){
this.courseVideoState.play();
}
public void speed(){
this.courseVideoState.speed();
}
public void stop(){
this.courseVideoState.stop();
}
public void pause(){
this.courseVideoState.pause();
}
}

@ -0,0 +1,21 @@
package com.baiye.design.behavioral.state;
public abstract class CourseVideoState {
/**
*
*/
protected CourseVideoContext courseVideoContext;
public void setCourseVideoContext(CourseVideoContext courseVideoContext) {
this.courseVideoContext = courseVideoContext;
}
/**
*
*/
public abstract void play();
public abstract void speed();
public abstract void pause();
public abstract void stop();
}

@ -0,0 +1,27 @@
package com.baiye.design.behavioral.state;
/**
*
*/
public class PauseState extends CourseVideoState{
@Override
public void play() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
}
@Override
public void pause() {
System.out.println("这是暂停状态");
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}

@ -0,0 +1,23 @@
package com.baiye.design.behavioral.state;
public class PlayState extends CourseVideoState{
@Override
public void play() {
System.out.println("正常播放视频状态");
}
@Override
public void speed() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
}
@Override
public void pause() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}

@ -0,0 +1,23 @@
package com.baiye.design.behavioral.state;
public class SpeedState extends CourseVideoState{
@Override
public void play() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed() {
System.out.println("这是快进状态");
}
@Override
public void pause() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);
}
@Override
public void stop() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
}
}

@ -0,0 +1,23 @@
package com.baiye.design.behavioral.state;
public class StopState extends CourseVideoState{
@Override
public void play() {
super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
}
@Override
public void speed() {
System.out.println("ERROR 停止状态不能快进");
}
@Override
public void pause() {
System.out.println("ERROR 停止状态不能暂停");
}
@Override
public void stop() {
System.out.println("这是停止状态");
}
}

@ -0,0 +1,22 @@
package com.baiye.design.behavioral.state;
public class Test {
public static void main(String[] args) {
CourseVideoContext courseVideoContext = new CourseVideoContext();
courseVideoContext.setCourseVideoState(new PlayState());
System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
// 进行切换状态
courseVideoContext.pause();
System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
// 进行切换状态
courseVideoContext.speed();
System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
// 进行切换状态
courseVideoContext.stop();
System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
// 可以对不能切换的状态进行限制
courseVideoContext.speed();
// todo 当需要新加一个状态的时候,只需要新加一个状态类即可
}
}

@ -0,0 +1,22 @@
package com.baiye.design.behavioral.visitor;
public class CodingCourse extends Course{
/**
*
*/
private Integer price;
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}

@ -0,0 +1,16 @@
package com.baiye.design.behavioral.visitor;
public abstract class Course {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void accept(IVisitor visitor);
}

@ -0,0 +1,8 @@
package com.baiye.design.behavioral.visitor;
public class FreeCourse extends Course{
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}

@ -0,0 +1,8 @@
package com.baiye.design.behavioral.visitor;
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}

@ -0,0 +1,26 @@
package com.baiye.design.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<>();
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC数据绑定");
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("Java设计模式精讲");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for (Course course : courseList) {
course.accept(new Visitor());
}
}
}

@ -0,0 +1,22 @@
package com.baiye.design.behavioral.visitor;
public class Visitor implements IVisitor{
/**
* ,
*/
@Override
public void visit(FreeCourse freeCourse) {
// todo 这里可以对是否可以进行访问进行逻辑判断
System.out.println(freeCourse.getName());
}
/**
* ,
*/
@Override
public void visit(CodingCourse codingCourse) {
// todo 这里可以对是否可以进行访问进行逻辑判断
System.out.println(codingCourse.getName() + "|" + codingCourse.getPrice());
}
}

@ -0,0 +1,7 @@
package com.baiye.design.structural.adapter.clazzadapter;
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配者的方法");
}
}

@ -0,0 +1,16 @@
package com.baiye.design.structural.adapter.clazzadapter;
/**
* AdapteeTarget
*
* @author q
* @date 2022/03/10
*/
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
// 。。 在这里可以增加一些逻辑代码
super.adapteeRequest();
// 。。 在这里可以增加一些逻辑代码
}
}

@ -0,0 +1,8 @@
package com.baiye.design.structural.adapter.clazzadapter;
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("ConcreteTarget 目标方法");
}
}

@ -0,0 +1,5 @@
package com.baiye.design.structural.adapter.clazzadapter;
public interface Target {
void request();
}

@ -0,0 +1,13 @@
package com.baiye.design.structural.adapter.clazzadapter;
public class Test {
public static void main(String[] args) {
// 适配的类实现
Target adapter = new Adapter();
adapter.request();
// 原始的实现
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
}
}

@ -0,0 +1,7 @@
package com.baiye.design.structural.adapter.objectadapter;
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配者的方法");
}
}

@ -0,0 +1,14 @@
package com.baiye.design.structural.adapter.objectadapter;
public class Adapter implements Target{
// 把 Adaptee 组合在这里
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
// 。。 在这里可以增加一些逻辑代码
adaptee.adapteeRequest();
// 。。 在这里可以增加一些逻辑代码
}
}

@ -0,0 +1,9 @@
package com.baiye.design.structural.adapter.objectadapter;
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("ConcreteTarget 目标方法");
}
}

@ -0,0 +1,5 @@
package com.baiye.design.structural.adapter.objectadapter;
public interface Target {
void request();
}

@ -0,0 +1,11 @@
package com.baiye.design.structural.adapter.objectadapter;
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapter = new Adapter();
adapter.request();
}
}

@ -0,0 +1,24 @@
package com.baiye.design.structural.composite;
public abstract class CatalogComponent {
public void add(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持添加操作");
}
public void remove(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持删除操作");
}
public String getName(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持获取名称操作");
}
public double getPrice(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持获取价格操作");
}
public void print() {
throw new UnsupportedOperationException("不支持打印操作");
}
}

@ -0,0 +1,27 @@
package com.baiye.design.structural.composite;
public class Course extends CatalogComponent{
private String name;
private Double price;
public Course(String name, Double price) {
this.name = name;
this.price = price;
}
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
@Override
public double getPrice(CatalogComponent catalogComponent) {
return this.price;
}
@Override
public void print() {
System.out.println("Course name : " + name + "Price : " + price);
}
}

@ -0,0 +1,36 @@
package com.baiye.design.structural.composite;
import java.util.ArrayList;
import java.util.List;
public class CourseCatalog extends CatalogComponent {
List<CatalogComponent> list = new ArrayList<>();
private String name;
public CourseCatalog(String name) {
this.name = name;
}
@Override
public void add(CatalogComponent catalogComponent) {
list.add(catalogComponent);
}
@Override
public void remove(CatalogComponent catalogComponent) {
list.remove(catalogComponent);
}
@Override
public void print() {
for (CatalogComponent catalogComponent : list) {
catalogComponent.print();
}
}
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
}

@ -0,0 +1,7 @@
package com.baiye.design.structural.composite;
public class Test {
public static void main(String[] args) {
// TODO: 2022/3/11 0011 补充资料
}
}

@ -0,0 +1,12 @@
package com.baiye.design.structural.decorator.v1;
public class Battercake {
protected String getDesc(){
return "煎饼";
}
protected int cost(){
return 8;
}
}

@ -0,0 +1,14 @@
package com.baiye.design.structural.decorator.v1;
public class BattercakeWithEgg extends Battercake{
@Override
protected String getDesc() {
return super.getDesc() + "加一个鸡蛋";
}
@Override
protected int cost() {
return super.cost() + 1;
}
}

@ -0,0 +1,14 @@
package com.baiye.design.structural.decorator.v1;
public class BattercakeWithEggSausage extends BattercakeWithEgg{
@Override
protected String getDesc() {
return super.getDesc() + "加一个香肠";
}
@Override
protected int cost() {
return super.cost() + 2;
}
}

@ -0,0 +1,21 @@
package com.baiye.design.structural.decorator.v1;
public class Test {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
Battercake battercake = new Battercake();
System.out.println(battercake.getDesc() + "销售价格 : " + battercake.cost());
Battercake battercakeWithEgg = new BattercakeWithEgg();
System.out.println(battercakeWithEgg.getDesc() + "销售价格 : " + battercakeWithEgg.cost());
Battercake battercakeWithEggSausage = new BattercakeWithEggSausage();
System.out.println(battercakeWithEggSausage.getDesc() + "销售价格 : " + battercakeWithEggSausage.cost());
// 有可能会出现类爆炸的情况
}
}

@ -0,0 +1,6 @@
package com.baiye.design.structural.decorator.v2;
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int cost();
}

@ -0,0 +1,23 @@
package com.baiye.design.structural.decorator.v2;
/**
* @author Administrator
*/
public class AbstractDecorator extends ABattercake{
private ABattercake aBattercake;
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
@Override
protected int cost() {
return this.aBattercake.cost();
}
}

@ -0,0 +1,25 @@
package com.baiye.design.structural.decorator.v2;
/**
* ,
*/
public abstract class AbstractDecorator2 extends ABattercake{
private ABattercake aBattercake;
public AbstractDecorator2(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
// 扩展的方法,继承该装饰者的类就要实现对应的方法
protected abstract void doSomething();
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
@Override
protected int cost() {
return this.aBattercake.cost();
}
}

@ -0,0 +1,13 @@
package com.baiye.design.structural.decorator.v2;
public class Battercake extends ABattercake{
@Override
protected String getDesc() {
return "一个煎饼";
}
@Override
protected int cost() {
return 8;
}
}

@ -0,0 +1,18 @@
package com.baiye.design.structural.decorator.v2;
public class EggDecorator extends AbstractDecorator{
public EggDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc() + "加一个鸡蛋";
}
@Override
protected int cost() {
return super.cost() + 1;
}
}

@ -0,0 +1,17 @@
package com.baiye.design.structural.decorator.v2;
public class SausageDecorator extends AbstractDecorator{
public SausageDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc() + "加一个香肠";
}
@Override
protected int cost() {
return super.cost() + 2;
}
}

@ -0,0 +1,11 @@
package com.baiye.design.structural.decorator.v2;
public class Test {
public static void main(String[] args) {
ABattercake aBattercake = new Battercake();
aBattercake = new EggDecorator(aBattercake);
aBattercake = new EggDecorator(aBattercake);
aBattercake = new SausageDecorator(aBattercake);
System.out.println(aBattercake.getDesc() + "售价为:" + aBattercake.cost());
}
}

@ -0,0 +1,5 @@
package com.baiye.design.structural.flyweight;
public interface Employee {
void reprot();
}

@ -0,0 +1,23 @@
package com.baiye.design.structural.flyweight;
import java.util.HashMap;
import java.util.Map;
public class EmployeeFactory extends Test {
public static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<>();
public static Employee getManager(String department){
Manager manager = (Manager) EMPLOYEE_MAP.get(department);
if (manager == null){
manager = new Manager(department);
System.out.println("创建部门经理: " + department);
String reportContent = department + "部门汇报,此次报告的主要内容是 ....";
manager.setReportContent(reportContent);
System.out.println(" 创建报告" + reportContent);
EMPLOYEE_MAP.put(department, manager);
}
return manager;
}
}

@ -0,0 +1,22 @@
package com.baiye.design.structural.flyweight;
public class Manager implements Employee{
@Override
public void reprot() {
System.out.println(reportContent);
}
// 内部状态
private String title;
// 外部状态
private String department;
private String reportContent;
public Manager(String department) {
this.department = department;
}
public void setReportContent(String reportContent) {
this.reportContent = reportContent;
}
}

@ -0,0 +1,25 @@
package com.baiye.design.structural.flyweight;
public class Test {
public static final String departments[] = {"RD", "QA", "PM", "BD"};
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
// 随机获取部门的名称
String department = departments[(int) (Math.random() * departments.length)];
Manager manager = (Manager) EmployeeFactory.getManager(department);
manager.reprot();
}
// 享元模式的源码级别应用 - 这里有缓存的
Integer a = Integer.valueOf(100);
Integer b = 100;
Integer c = Integer.valueOf(1000);
Integer d = 1000;
System.out.println("a==b: " + (a == b));
System.out.println("c==d: " + (c == d));
}
}

@ -21,6 +21,7 @@
<module>jpa/dev-protocol-jpa-auditing2</module> <module>jpa/dev-protocol-jpa-auditing2</module>
<module>jpa/dev-protocol-jpa-auditing3</module> <module>jpa/dev-protocol-jpa-auditing3</module>
<module>jpa/dev-protocol-jpa-entity-callback</module> <module>jpa/dev-protocol-jpa-entity-callback</module>
<module>dev-protocol-design-pattern</module>
</modules> </modules>
<properties> <properties>

Loading…
Cancel
Save