设计模式

This commit is contained in:
limqhz
2023-02-28 18:49:09 +08:00
parent 10c8feed0f
commit c754833cef
50 changed files with 717 additions and 11 deletions

View File

@@ -3,7 +3,7 @@
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>forever</artifactId>
<artifactId>type-demo</artifactId>
<groupId>com.love.qn</groupId>
<version>1.0.0</version>
</parent>

View File

@@ -0,0 +1,9 @@
package com.quinn.sjms.adapter;
public class Adaptee {
public void doSomething(){
System.out.println("源角色");
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.adapter;
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
super.doSomething();
}
}

View File

@@ -0,0 +1,15 @@
package com.quinn.sjms.adapter;
public class AdapterClient {
public static void main(String[] args) {
Target target = new TargetImpl();
target.request();
//现在增加了适配器角色后的业务逻辑
Target target2 = new Adapter();
target2.request();
}
}

View File

@@ -0,0 +1,7 @@
package com.quinn.sjms.adapter;
public interface Target {
public void request();
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.adapter;
public class TargetImpl implements Target {
@Override
public void request() {
System.out.println("call me to help u");
}
}

View File

@@ -0,0 +1,34 @@
package com.quinn.sjms.chain;
// 此处防止报错随便引入的对象,无关该模式
import sun.misc.Request;
import javax.xml.ws.Response;
import java.util.logging.Level;
public abstract class Handler {
private Handler nextHandler;
//每个处理者都必须对请求做出处理 (模板模式)
public final Response handleMessage(Request request){
Response response = null;
//判断是否是自己的处理级别
if(this.getHandlerLevel().equals(request)){
response = this.echo(request);
}else{ //不属于自己的处理级别
//判断是否有下一个处理者
if(this.nextHandler != null){
response = this.nextHandler.handleMessage(request);
}else{
//没有适当的处理者,业务自行处理
}
}
return response;
}
//设置下一个处理者是谁
public void setNext(Handler _handler){
this.nextHandler = _handler;
}
//每个处理者都有一个处理级别
protected abstract Level getHandlerLevel();
//每个处理者都必须实现处理任务
protected abstract Response echo(Request request);
}

View File

@@ -0,0 +1,7 @@
package com.quinn.sjms.decorator;
public abstract class Component {
public abstract void operate();
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.decorator;
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("do Something");
}
}

View File

@@ -0,0 +1,15 @@
package com.quinn.sjms.decorator;
public abstract class Decorator extends Component{
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}

View File

@@ -0,0 +1,11 @@
package com.quinn.sjms.decorator;
public class DecoratorClient {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new DecoratorImpl(component);
component = new DecoratorImpl2(component);
component.operate();
}
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.decorator;
public class DecoratorImpl extends Decorator {
public DecoratorImpl(Component component) {
super(component);
}
private void myMethod(){
System.out.println("my method");
}
@Override
public void operate() {
myMethod();
super.operate();
}
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.decorator;
public class DecoratorImpl2 extends Decorator {
public DecoratorImpl2(Component component) {
super(component);
}
private void myMethod(){
System.out.println("my method2");
}
@Override
public void operate() {
myMethod();
super.operate();
}
}

View File

@@ -0,0 +1,11 @@
package com.quinn.sjms.iterator;
public interface IProject {
void add (String name);
String getProjectInfo();
ProjectIterator iterator();
}

View File

@@ -0,0 +1,35 @@
package com.quinn.sjms.iterator;
import java.util.ArrayList;
public class IProjectImpl implements IProject {
//定义一个项目列表,说有的项目都放在这里
private ArrayList<IProject> projectList = new ArrayList<IProject>();
private String name;
public IProjectImpl() {
}
private IProjectImpl(String name) {
this.name = name;
}
@Override
public void add(String name) {
this.projectList.add(new IProjectImpl(name));
}
@Override
public String getProjectInfo() {
String info = "";
//获得项目的名称
info = info+ "项目名称是:" + this.name;
return info;
}
@Override
public ProjectIterator iterator() {
return new ProjectIterator(projectList);
}
}

View File

@@ -0,0 +1,6 @@
package com.quinn.sjms.iterator;
import java.util.Iterator;
public interface IProjectIterator extends Iterator {
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.iterator;
public class IteratorClient {
public static void main(String[] args) {
IProject project = new IProjectImpl();
project.add("type");
project.add("das");
project.add("tde");
IProjectIterator projectIterator = project.iterator();
while(projectIterator.hasNext()){
IProject p = (IProject) projectIterator.next();
System.out.println(p.getProjectInfo());
}
}
}

View File

@@ -0,0 +1,24 @@
package com.quinn.sjms.iterator;
import java.util.ArrayList;
public class ProjectIterator implements IProjectIterator {
//所有的项目都放在ArrayList中
private ArrayList<IProject> projectList = new ArrayList<IProject>();
private int currentItem = 0;
//构造函数传入projectList
public ProjectIterator(ArrayList<IProject> projectList){
this.projectList = projectList;
}
@Override
public boolean hasNext() {
return projectList != null && projectList.size() - 1 >= currentItem;
}
@Override
public IProject next() {
return this.projectList.get(this.currentItem++);
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.makeup;
public abstract class Component {
public void doSomething(){
// all of us
System.out.println("all of us");
}
}

View File

@@ -0,0 +1,27 @@
package com.quinn.sjms.makeup;
import java.util.ArrayList;
/**
* 树枝构件
* 树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。
* 我们来看组合模式的通用源代码,首先看抽象构件,它是组合模式的精髓
*/
public class Composite extends Component {
//构件容器
private ArrayList<Component> componentArrayList = new ArrayList<Component>();
//增加一个叶子构件或树枝构件
public void add(Component component){
this.componentArrayList.add(component);
}
//删除一个叶子构件或树枝构件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//获得分支下的所有叶子构件和树枝构件
public ArrayList<Component> getChildren(){
return this.componentArrayList;
}
}

View File

@@ -0,0 +1,12 @@
package com.quinn.sjms.makeup;
/**
* 叶子对象,其下再也没有其他的分支,也就是遍历的最小单位
*/
public class Leaf extends Component {
@Override
public void doSomething() {
System.out.println("leaf");
}
}

View File

@@ -0,0 +1,31 @@
package com.quinn.sjms.makeup;
public class MakeUpClient {
public static void main(String[] args) {
//创建一个根节点
Composite root = new Composite();
root.doSomething();
//创建一个树枝构件
Composite branch = new Composite();
//创建一个叶子节点
Leaf leaf = new Leaf();
//建立整体
root.add(branch);
branch.add(leaf);
display(root);
}
//通过递归遍历树
public static void display(Composite root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){ //叶子节点
c.doSomething();
}else{ //树枝节点
display((Composite)c);
}
}
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.mediator;
public abstract class AbstractColleague {
protected AbstractMediator mediator;
public AbstractColleague(AbstractMediator _mediator){
this.mediator = _mediator;
}
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.mediator;
public abstract class AbstractMediator {
protected Purchase purchase;
protected Sale sale;
protected Stock stock;
//构造函数
public AbstractMediator(){
purchase = new Purchase(this);
sale = new Sale(this);
stock = new Stock(this);
}
//中介者最重要的方法叫做事件方法,处理多个对象之间的关系
public abstract void execute(String str,Object...objects);
}

View File

@@ -0,0 +1,47 @@
package com.quinn.sjms.mediator;
public class Mediator extends AbstractMediator {
@Override
public void execute(String str, Object... objects) {
if(str.equals("purchase.buy")){ //采购电脑
this.buyComputer((Integer)objects[0]);
}else if(str.equals("sale.sell")){ //销售电脑
this.sellComputer((Integer)objects[0]);
}else if(str.equals("sale.offsell")){ //折价销售
this.offSell();
}else if(str.equals("stock.clear")){ //清仓处理
this.clearStock();
}
}
//采购电脑
private void buyComputer(int number){
int saleStatus = super.sale.getSaleStatus();
if(saleStatus>80){ //销售情况良好
System.out.println("采购IBM电脑:"+number + "");
super.stock.increase(number);
}else{ //销售情况不好
int buyNumber = number/2; //折半采购
System.out.println("采购IBM电脑"+buyNumber+ "");
}
}
//销售电脑
private void sellComputer(int number){
if(super.stock.getStockNumber()<number){ //库存数量不够销售
super.purchase.buyIBMcomputer(number);
}
super.stock.decrease(number);
}
//折价销售电脑
private void offSell(){
System.out.println("折价销售IBM电脑"+stock.getStockNumber()+"");
}
//清仓处理
private void clearStock(){
//要求清仓销售
super.sale.offSale();
//要求采购人员不要采购
super.purchase.refuseBuyIBM();
}
}

View File

@@ -0,0 +1,22 @@
package com.quinn.sjms.mediator;
public class MediatorClient {
public static void main(String[] args) {
AbstractMediator mediator = new Mediator();
//采购人员采购电脑
System.out.println("------采购人员采购电脑--------");
Purchase purchase = new Purchase(mediator);
purchase.buyIBMcomputer(100);
//销售人员销售电脑
System.out.println("\n------销售人员销售电脑--------");
Sale sale = new Sale(mediator);
sale.sellIBMComputer(1);
//库房管理人员管理库存
System.out.println("\n------库房管理人员清库处理--------");
Stock stock = new Stock(mediator);
stock.clearStock();
}
}

View File

@@ -0,0 +1,16 @@
package com.quinn.sjms.mediator;
public class Purchase extends AbstractColleague{
public Purchase(AbstractMediator _mediator){
super(_mediator);
}
//采购IBM电脑
public void buyIBMcomputer(int number){
super.mediator.execute("purchase.buy", number);
}
//不再采购IBM电脑
public void refuseBuyIBM(){
System.out.println("不再采购IBM电脑");
}
}

View File

@@ -0,0 +1,27 @@
package com.quinn.sjms.mediator;
import java.util.Random;
public class Sale extends AbstractColleague{
public Sale(AbstractMediator _mediator){
super(_mediator);
}
//销售IBM电脑
public void sellIBMComputer(int number){
super.mediator.execute("sale.sell", number);
System.out.println("销售IBM电脑"+number+"");
}
//反馈销售情况0100变化0代表根本就没人买100代表非常畅销出一个卖一个
public int getSaleStatus(){
Random rand = new Random(System.currentTimeMillis());
int saleStatus = rand.nextInt(100);
System.out.println("IBM电脑的销售情况为"+saleStatus);
return saleStatus;
}
//折价处理
public void offSale(){
super.mediator.execute("sale.offsell");
}
}

View File

@@ -0,0 +1,29 @@
package com.quinn.sjms.mediator;
public class Stock extends AbstractColleague{
public Stock(AbstractMediator _mediator){
super(_mediator);
}
//刚开始有100台电脑
private static int COMPUTER_NUMBER =100;
//库存增加
public void increase(int number){
COMPUTER_NUMBER = COMPUTER_NUMBER + number;
System.out.println("库存数量为:"+COMPUTER_NUMBER);
}
//库存降低
public void decrease(int number){
COMPUTER_NUMBER = COMPUTER_NUMBER - number;
System.out.println("库存数量为:"+COMPUTER_NUMBER);
}
//获得库存数量
public int getStockNumber(){
return COMPUTER_NUMBER;
}
//存货压力大了,就要通知采购人员不要采购,销售人员要尽快销售
public void clearStock(){
System.out.println("清理存货数量为:"+COMPUTER_NUMBER);
super.mediator.execute("stock.clear");
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.order;
public class BigReceiver extends Receiver{
@Override
public void doSomething() {
System.out.println("我来做一些事情吧");
}
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.order;
public class ByeCommand extends Command{
//哪个Receiver类进行命令处理
private Receiver receiver;
//构造函数传递接收者
public ByeCommand(Receiver _receiver){
this.receiver = _receiver;
}
@Override
public void execute() {
System.out.println("say Bye-Bye");
receiver.doSomething();
}
}

View File

@@ -0,0 +1,7 @@
package com.quinn.sjms.order;
public abstract class Command {
public abstract void execute();
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.order;
public class HelloCommand extends Command{
//哪个Receiver类进行命令处理
private Receiver receiver;
//构造函数传递接收者
public HelloCommand(Receiver _receiver){
this.receiver = _receiver;
}
@Override
public void execute() {
System.out.println("say Hello");
receiver.doSomething();
}
}

View File

@@ -0,0 +1,15 @@
package com.quinn.sjms.order;
public class Invoker {
private Command command;
//受气包,接受命令
public void setCommand(Command _command){
this.command = _command;
}
//执行命令
public void action(){
this.command.execute();
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.order;
public class OrderClient {
public static void main(String[] args) {
Invoker invoker = new Invoker();
// 此处具体使用,应该把接受者也封装掉,这样就在客户端无需感知接受者了
HelloCommand helloCommand = new HelloCommand(new BigReceiver());
invoker.setCommand(helloCommand);
invoker.action();
}
}

View File

@@ -0,0 +1,6 @@
package com.quinn.sjms.order;
public abstract class Receiver {
//抽象接收者,定义每个接收者都必须完成的业务
public abstract void doSomething();
}

View File

@@ -0,0 +1,19 @@
package com.quinn.sjms.prototype;
import java.util.ArrayList;
public class Thing implements Cloneable{
//定义一个私有变量
private ArrayList<String> arrayList = new ArrayList<String>();
@Override
public Thing clone(){
Thing thing=null;
try {
thing = (Thing)super.clone();
this.arrayList = (ArrayList<String>)this.arrayList.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return thing;
}
}

View File

@@ -17,6 +17,25 @@ public class Client {
proxy.login("zhangSan", "password");
proxy.killBoss();
proxy.upgrade();
// 动态代理
//定义一个主题
IGamePlayer iGamePlayer = new GamePlayer("张三");
//定义一个Handler
InvocationHandler h = new GamePlayIH(iGamePlayer);
//定义主题的代理
IGamePlayer proxyInstance = DynamicProxy.newProxyInstance(iGamePlayer.getClass().
getClassLoader(), iGamePlayer.getClass().getInterfaces(),handler);
//代理的行为
proxyInstance.upgrade();
}
}

View File

@@ -0,0 +1,20 @@
package com.quinn.sjms.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxy {
public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){
//寻找JoinPoint连接点AOP框架使用元数据定义
if(true){
// 此处执行位置 为 连接点 Joint point , 也就是 Advice 执行的位置
//执行一个前置通知
System.out.println("执行一个前置通知");
}
//执行目标,并返回结果
return (T)Proxy.newProxyInstance(loader,interfaces, h);
}
}

View File

@@ -13,7 +13,10 @@ public class GamePlayIH implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(proxy,args);
// 不要在此处调用对象方法,很容易会造成死循环
System.out.println(method.getName());
System.out.println(target);
Object invoke = method.invoke(target,args);
return invoke;
}
}

View File

@@ -0,0 +1,27 @@
package com.quinn.sjms.tactics;
public enum Calculator {
//加法运算
ADD("+"){
public int exec(int a,int b){
return a+b;
}
},
//减法运算
SUB("-"){
public int exec(int a,int b){
return a - b;
}
};
String value = "";
//定义成员值类型
private Calculator(String _value){
this.value = _value;
}
//获得枚举成员的值
public String getValue(){
return this.value;
}
//声明一个抽象函数
public abstract int exec(int a,int b);
}

View File

@@ -0,0 +1,14 @@
package com.quinn.sjms.tactics;
public class Context {
private Strategy strategy = null;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//封装后的策略方法
public void doAnything(){
this.strategy.doSomething();
}
}

View File

@@ -0,0 +1,7 @@
package com.quinn.sjms.tactics;
public interface Strategy {
void doSomething();
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.tactics;
public class StrategyImpl implements Strategy {
@Override
public void doSomething() {
System.out.println("Do something");
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.tactics;
public class TacticsClient {
public static void main(String[] args) {
Strategy strategy = new StrategyImpl();
Context context = new Context(strategy);
context.doAnything();
Calculator.ADD.exec(1,2);
Calculator.ADD.exec(1,2);
}
}