MCPcopy Index your code
hub / github.com/youlookwhat/DesignPattern

github.com/youlookwhat/DesignPattern @main sqlite

repository ↗ · DeepWiki ↗
560 symbols 1,114 edges 169 files 211 documented · 38%
README

DesignPattern

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

设计模式分为三种类型,共23种:

参照Hongyang、菜鸟教程等处文章所写。如有错误欢迎指正,如有侵权,请联系我删除。


Blog Catalogue:

Source Code

Project Picture

Pattern Analysis

1. 观察者模式

定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

  • 对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter , 当然了 XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。

  • 专题接口:Subject.java ;

    ```java /* * 注册一个观察者 / public void registerObserver(Observer observer);

    /* * 移除一个观察者 / public void removeObserver(Observer observer);

    /* * 通知所有观察者 / public void notifyObservers(); ```

  • 3D服务号的实现类:ObjectFor3D.java

    java @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index >= 0) { observers.remove(index); } } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(msg); } } /** * 主题更新信息 */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); }

  • 所有观察者需要实现此接口:Observer.java

    java public ObserverUser1(Subject subject) { subject.registerObserver(this); } @Override public void update(String msg) { Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。"); }

  • 最后测试:ObserverActivity.java

    java // 创建服务号 objectFor3D = new ObjectFor3D(); // 创建两个订阅者 observerUser1 = new ObserverUser1(objectFor3D); observerUser2 = new ObserverUser2(objectFor3D); // 两个观察者,发送两条信息 objectFor3D.setMsg("201610121 的3D号为:127"); objectFor3D.setMsg("20161022 的3D号为:000");

2. 工厂模式

简单列一下这个模式的家族:

  • 1、静态工厂模式

    • 这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。
  • 2、简单工厂模式(店里买肉夹馍)

    • 定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
    • 根据类型直接创建肉夹馍:SimpleRoujiaMoFactory.java

    java public RoujiaMo creatRoujiaMo(String type) { RoujiaMo roujiaMo = null; switch (type) { case "Suan": roujiaMo = new ZSuanRoujiaMo(); break; case "La": roujiaMo = new ZLaRoujiaMo(); break; case "Tian": roujiaMo = new ZTianRoujiaMo(); break; default:// 默认为酸肉夹馍 roujiaMo = new ZSuanRoujiaMo(); break; } return roujiaMo; }

  • 3、工厂方法模式(开分店)

    • 定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。
    • 对比定义:
    • 1、定义了创建对象的一个接口:public abstract RouJiaMo sellRoujiaMo(String type);
    • 2、由子类决定实例化的类,可以看到我们的馍是子类生成的。
  • 提供创建肉夹馍店抽象方法:RoujiaMoStore.java

    java public abstract RoujiaMo sellRoujiaMo(String type);

  • 具体实现抽象方法:XianRoujiaMoStore.java

  • 分店依旧使用简单工厂模式:XianSimpleRoujiaMoFactory.java

  • 4、抽象工厂模式(使用官方提供的原料)

    • 定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。
    • 对比定义:
      • 1、提供一个接口:public interface RouJiaMoYLFactroy
      • 2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。
    • 创建用于提供原料的接口工厂:RoujiaMoYLFactory.java
    • 各自分店实现接口,完成原料提供:XianRoujiaMoYLFoctory.java
    • 准备时,使用官方的原料:RoujiaMo.java

    java /** * 准备工作 */ public void prepare(RoujiaMoYLFactory roujiaMoYLFactory) { Meet meet = roujiaMoYLFactory.creatMeet(); YuanLiao yuanLiao = roujiaMoYLFactory.creatYuanLiao(); Log.e("---RoujiaMo:", "使用官方的原料 ---" + name + ": 揉面-剁肉-完成准备工作 yuanLiao:"+meet+"yuanLiao:"+yuanLiao); }

3. 单例设计模式

单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例

  • 定义:只需要三步就可以保证对象的唯一性
  • (1) 不允许其他程序用new对象
  • (2) 在该类中创建对象
  • (3) 对外提供一个可以让其他程序获取该对象的方法
  • 对比定义:
  • (1) 私有化该类的构造函数
  • (2) 通过new在本类中创建一个本类对象
  • (3) 定义一个公有的方法,将在该类中所创建的对象返回

  • 饿汉式[可用]:SingletonEHan.java

  • 含懒汉式[双重校验锁 推荐用]:SingletonLanHan.java

```java private SingletonLanHan() {} private static SingletonLanHan singletonLanHanFour; public static SingletonLanHan getSingletonLanHanFour() { if (singletonLanHanFour == null) { synchronized (SingletonLanHan.class) { if (singletonLanHanFour == null) { singletonLanHanFour = new SingletonLanHan(); } } } return singletonLanHanFour; }

```

4. 策略模式

策略模式:定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。

  • 以创建游戏角色为例子:
    • 最初的游戏角色的父类:Role.java
    • 发现有重复代码后,重构后的父类:[Role.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/desi

Extension points exported contracts — how you extend this code

IEquip (Interface)
Created by jingbin on 2016/11/1. 装备的接口 下面有:武器,护腕,鞋子,戒指、、、、还有装饰品接口 [11 implementers]
app/src/main/java/com/example/jingbin/designpattern/decorator/IEquip.java
IDefendBehavior (Interface)
Created by jingbin on 2016/10/30. [6 implementers]
app/src/main/java/com/example/jingbin/designpattern/strategy/better/IDefendBehavior.java
IRunBehavior (Interface)
Created by jingbin on 2016/10/30. [6 implementers]
app/src/main/java/com/example/jingbin/designpattern/strategy/better/IRunBehavior.java
IDisplayBehavior (Interface)
Created by jingbin on 2016/10/30. [8 implementers]
app/src/main/java/com/example/jingbin/designpattern/strategy/better/IDisplayBehavior.java
IAttackBehavior (Interface)
Created by jingbin on 2016/10/30. [6 implementers]
app/src/main/java/com/example/jingbin/designpattern/strategy/better/IAttackBehavior.java

Core symbols most depended-on inside this repo

fromHtml
called by 24
app/src/main/java/com/example/jingbin/designpattern/app/EMTagHandler.java
getId
called by 11
app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java
keyPressed
called by 9
app/src/main/java/com/example/jingbin/designpattern/command/ControlPanel.java
setState
called by 9
app/src/main/java/com/example/jingbin/designpattern/state/better/VendingMachineBetter.java
workOneDay
called by 7
app/src/main/java/com/example/jingbin/designpattern/templatemethod/Worker.java
add
called by 7
app/src/main/java/com/example/jingbin/designpattern/composite/Employee.java
insertMoney
called by 7
app/src/main/java/com/example/jingbin/designpattern/state/better/VendingMachineBetter.java
turnCrank
called by 7
app/src/main/java/com/example/jingbin/designpattern/state/better/VendingMachineBetter.java

Shape

Method 388
Class 151
Interface 20
Enum 1

Languages

Java100%

Modules by API surface

app/src/main/java/com/example/jingbin/designpattern/state/better/VendingMachineBetter.java13 symbols
app/src/main/java/com/example/jingbin/designpattern/app/EMTagHandler.java12 symbols
app/src/main/java/com/example/jingbin/designpattern/templatemethod/Worker.java9 symbols
app/src/main/java/com/example/jingbin/designpattern/strategy/better/Role.java9 symbols
app/src/main/java/com/example/jingbin/designpattern/MainActivity.java8 symbols
app/src/main/java/com/example/jingbin/designpattern/strategy/old/RoleB.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/strategy/old/RoleA.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/state/old/VendingMachine.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/state/better/WinnerState.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/state/better/SoldState.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/state/better/SoldOutState.java6 symbols
app/src/main/java/com/example/jingbin/designpattern/state/better/NoMoneyState.java6 symbols

For agents

$ claude mcp add DesignPattern \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact