设计模式

This commit is contained in:
limqhz
2023-02-24 17:45:21 +08:00
parent 2dce712c97
commit 10c8feed0f
35 changed files with 506 additions and 1 deletions

35
sjms/pom.xml Normal file
View File

@@ -0,0 +1,35 @@
<?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>forever</artifactId>
<groupId>com.love.qn</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sjms</artifactId>
<dependencies>
<dependency>
<groupId>com.love.qn</groupId>
<artifactId>common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.12</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,27 @@
package com.quinn.sjms;
import com.quinn.sjms.model.Father;
import com.quinn.sjms.model.Son;
import java.util.HashMap;
import java.util.Map;
public class LiskovDemo {
public static void main(String[] args) {
HashMap hMap = new HashMap();
Map map = new HashMap();
Father f = new Father();
f.say(hMap);
Son s = new Son();
s.say(hMap);
Son s1 = new Son();
s1.say(map);
// Father f1 = new Father();
// f1.say(map);
}
}

View File

@@ -0,0 +1,9 @@
package com.quinn.sjms.abstractpro;
public abstract class AbstractCreator {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public abstract class AbstractProductA {
//每个产品共有的方法
public void shareMethod(){
}
//每个产品相同方法,不同实现
public abstract void doSomething();
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public abstract class AbstractProductB {
//每个产品共有的方法
public void shareMethod(){
}
//每个产品相同方法,不同实现
public abstract void doSomething();
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.abstractpro;
public class Client {
public static void main(String[] args) {
//定义出两个工厂
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//产生A1对象
AbstractProductA a1 = creator1.createProductA();
//产生A2对象
AbstractProductA a2 = creator2.createProductA();
//产生B1对象
AbstractProductB b1 = creator1.createProductB();
//产生B2对象
AbstractProductB b2 = creator2.createProductB();
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.abstractpro;
public class Creator1 extends AbstractCreator{
//只生产产品等级为1的A产品
public AbstractProductA createProductA() {
return new ProductA1();
}
//只生产产品等级为1的B产品
public AbstractProductB createProductB() {
return new ProductB1();
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.abstractpro;
public class Creator2 extends AbstractCreator{
//只生产产品等级为2的A产品
public AbstractProductA createProductA() {
return new ProductA2();
}
//只生产产品等级为2的B产品
public AbstractProductB createProductB() {
return new ProductB2();
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public class ProductA1 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("产品A1的实现方法");
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public class ProductA2 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("产品A2的实现方法");
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public class ProductB1 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("产品B1的实现方法");
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.abstractpro;
public class ProductB2 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("产品B2的实现方法");
}
}

View File

@@ -0,0 +1,11 @@
package com.quinn.sjms.model;
import java.util.HashMap;
public class Father {
public void say(HashMap hashMap) {
System.out.println("Father say");
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.model;
public class InvokeFather {
public Father invoke (){
return new Father();
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.model;
public class InvokeSon extends InvokeFather{
@Override
public Son invoke() {
return new Son();
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.model;
import java.util.Map;
public class Son extends Father {
public void say(Map hashMap) {
System.out.println("Son say");
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.modelfunction;
public abstract class HanmaCar {
public void run(){
System.out.println("开始跑了");
}
public abstract void job();
public final void didi(){
System.out.println("按喇叭");
}
}

View File

@@ -0,0 +1,9 @@
package com.quinn.sjms.modelfunction;
public class HanmaH1Car extends HanmaCar{
@Override
public void job() {
}
}

View File

@@ -0,0 +1,27 @@
package com.quinn.sjms.other;
import lombok.Data;
@Data
public class CanClone implements Cloneable{
private String name;
private String line;
@Override
protected CanClone clone() throws CloneNotSupportedException {
return (CanClone) super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
CanClone canClone = new CanClone();
canClone.setName("dad");
canClone.setLine("test");
CanClone clone = canClone.clone();
canClone.setLine("new");
System.out.println(canClone);
System.out.println(clone);
}
}

View File

@@ -0,0 +1,28 @@
package com.quinn.sjms.other;
import cn.hutool.core.clone.CloneSupport;
import lombok.Data;
@Data
public class CanHuToolClone extends CloneSupport<CanHuToolClone> {
private String name;
private String line;
@Override
public CanHuToolClone clone() {
return (CanHuToolClone) super.clone();
}
public static void main(String[] args) {
CanHuToolClone canClone = new CanHuToolClone();
canClone.setName("dad");
canClone.setLine("test");
CanHuToolClone clone = canClone.clone();
canClone.setLine("new");
System.out.println(canClone);
System.out.println(clone);
}
}

View File

@@ -0,0 +1,28 @@
package com.quinn.sjms.product;
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product=null;
try {
Class<?> aClass = Class.forName(c.getName());
product = (Product) aClass.newInstance();
} catch (Exception e) {
//异常处理
}
return (T)product;
}
public static void main(String[] args) {
ConcreteCreator creator = new ConcreteCreator();
CustomProduct1 product = creator.createProduct(CustomProduct1.class);
product.method2();
product.method1();
CustomProduct2 product2 = creator.createProduct(CustomProduct2.class);
product2.method2();
product2.method1();
}
}

View File

@@ -0,0 +1,14 @@
package com.quinn.sjms.product;
/**
* 抽象工厂
*/
public abstract class Creator {
/*
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为String、Enum、Class等当然也可以为空
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}

View File

@@ -0,0 +1,14 @@
package com.quinn.sjms.product;
public class CustomProduct1 extends Product{
@Override
public void method1() {
System.out.println("CustomProduct1.method1");
}
@Override
public void method2() {
System.out.println("CustomProduct1.method2()");
}
}

View File

@@ -0,0 +1,8 @@
package com.quinn.sjms.product;
public class CustomProduct2 extends Product{
@Override
public void method2() {
System.out.println("CustomProduct2.method2()");
}
}

View File

@@ -0,0 +1,13 @@
package com.quinn.sjms.product;
public abstract class Product {
//产品类的公共方法
public void method1(){
System.out.println("Product.method1");
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}

View File

@@ -0,0 +1,22 @@
package com.quinn.sjms.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) throws Exception {
GamePlayer player = new GamePlayer("张三");
InvocationHandler handler = new GamePlayIH(player);
//获得类的class loader
ClassLoader cl = player.getClass().getClassLoader();
//动态产生一个代理者
IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(cl,
new Class[]{IGamePlayer.class},handler);
//登录
proxy.login("zhangSan", "password");
proxy.killBoss();
proxy.upgrade();
}
}

View File

@@ -0,0 +1,19 @@
package com.quinn.sjms.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class GamePlayIH implements InvocationHandler {
Object target;
public GamePlayIH(Object _obj){
this.target = _obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(proxy,args);
return invoke;
}
}

View File

@@ -0,0 +1,35 @@
package com.quinn.sjms.proxy;
import lombok.Data;
@Data
public class GamePlayer implements IGamePlayer {
private String name = "";
//构造函数限制谁能创建对象,并同时传递姓名
public GamePlayer(String _name) throws Exception{
this.name = _name;
}
//构造函数限制谁能创建对象,并同时传递姓名
public GamePlayer(IGamePlayer _gamePlayer,String _name) throws Exception{
if(_gamePlayer == null ){
throw new Exception("不能创建真实角色!");
}else{
this.name = _name;
}
}
//打怪,最期望的就是杀老怪
public void killBoss() {
System.out.println(this.name + "在打怪!");
}
//进游戏之前你肯定要登录吧,这是一个必要条件
public void login(String user, String password) {
System.out.println("登录名为"+user + "的用户" + this.name + "登录成功!");
}
//升级,升级有很多方法,花钱买是一种,做任务也是一种
public void upgrade() {
System.out.println(this.name + " 又升了一级!");
}
}

View File

@@ -0,0 +1,25 @@
package com.quinn.sjms.proxy;
public class GamePlayerProxy{
private IGamePlayer gamePlayer = null;
//通过构造函数传递要对谁进行代练
// public GamePlayerProxy(String name){
// try {
// gamePlayer = new GamePlayer(this,name);
// } catch (Exception e) {
// }
// }
//代练杀怪
public void killBoss() {
this.gamePlayer.killBoss();
}
//代练登录
public void login(String user, String password) {
this.gamePlayer.login(user, password);
}
//代练升级
public void upgrade() {
this.gamePlayer.upgrade();
}
}

View File

@@ -0,0 +1,10 @@
package com.quinn.sjms.proxy;
public interface IGamePlayer {
//登录游戏
public void login(String user,String password);
//杀怪,网络游戏的主要特色
public void killBoss();
//升级
public void upgrade();
}

View File

@@ -0,0 +1,17 @@
package com.quinn.sjms.singleton;
public class Singleton {
private static Singleton singleton = null;
//限制产生多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
if(singleton == null){ // 懒汉式 // 饿汉式 全局静态变量已经New 了对象,无需判空
singleton = new Singleton();
}
return singleton;
}
}