
设计模式
Nuan_Feng
蓝桥杯国赛一等奖。唯有志存千里,方能风行天下。
展开
-
单例模式的五种创建方式(涉及原理)
这里写自定义目录标题饿汉式懒汉式懒汉式引发的并发问题解决方案方法添加同步使用独占锁使用静态内部类参考mybatis单例模式饿汉式public class Singleton2 { private static Singleton2 uniqueInstance = new Singleton2(); private Singleton2() { } public static Singleton2 getInstance() { return uniqueInstance; }}原创 2020-06-10 19:27:50 · 457 阅读 · 0 评论 -
设计模式工作应用
策略定义策略context类定义策略类这里可以考虑用枚举优化,以及策略类通过spring根据策略接口获取模板orderMsgDingding对应数据库表,存储权限命名的类和订单状态关系,这样当涉及改变,只需要修改类和订单状态即可,public class OrderStatusExec implements BeanFactoryAware { @Autowired private OrderMsgDingdingService orderMsgDingdingService; @A原创 2020-05-13 09:15:03 · 282 阅读 · 0 评论 -
模板方法模式-Applet
package I_Template.Applet;import java.applet.Applet; import java.awt.Graphics;public class MyApplet extends Applet { String message;// init钩子用来进行applet初始化动作public void init() { message = "he原创 2017-02-23 14:11:24 · 490 阅读 · 0 评论 -
单例模式-多线程解决方案1
package E_Singleton.thread;/** * 多线程解决方案1 * 缺点:只有第一次执行方法时才需要同步,设置好uniqueInstance变量,不再需要sync了,之后每次调用都浪费资源 * * @author Administrator * */ public class Singleton1 { private static Singl原创 2017-02-23 13:56:11 · 730 阅读 · 0 评论 -
组合模式
package K_Composite;import java.util.Iterator; import java.util.Stack;/** * 组合迭代器 * 外部迭代器,所以需要维护组合递归结构的位置,采用栈维护 */ public class CompositeIterator implements Iterator { Stack stack = new St原创 2017-03-03 23:35:10 · 234 阅读 · 0 评论 -
状态模式1
package L_State.a;/** * 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了他的类 * 与策略模式不同的时,策略模式,用户可以主动指定context所要组合的策对象,通常都只有一个最适当的策略对象, * 状态模式将一群行为封装在状态对象中,context行为可以随时委托给其中行为,但是context的客户不知道状态对象 *状态模转化可以由sta原创 2017-03-03 23:35:39 · 252 阅读 · 0 评论 -
状态模式2
package L_State.b;/** *还存在如下问题: * 1:重复代码,如错误信息不会给用户看,可以把所有错误行为写的通用 * 2:dispense()即使没有25分,当转动曲柄后也会执行,可使用布尔值or异常处理 * 3:状态转换都放在状态类中了,可以放在糖果机中 * 4:实例GumballMachine过多后,要将状态实例移到静态实例变量中 */ pu原创 2017-03-03 23:36:11 · 283 阅读 · 0 评论 -
代理模式
package M_Proxy.b;import java.rmi.Naming; import java.rmi.registry.LocateRegistry;/** *代理模式:为另一个对象提供替身或占位符以控制对这个对象的访问 * * 1:GumballMachineRemote * 2:GumballMachine extends UnicastRemoteObjec原创 2017-03-03 23:37:46 · 221 阅读 · 0 评论 -
代理模式-动态代理
package M_Proxy.dynamic;import java.lang.reflect.Proxy;/** *使用动态代理完成保护代理 * */ public class MatchMakingTestDrive {public static void main(String[] args) { MatchMakingTestDrive test = new Matc原创 2017-03-03 23:38:11 · 187 阅读 · 0 评论 -
代理模式-虚拟代理(image)
package M_Proxy.image;import java.awt.Component; import java.awt.Graphics; import java.net.URL;import javax.swing.Icon; import javax.swing.ImageIcon;/** * 设计CD封面虚拟代理 * 1:imageProxy创建imageIcon,开原创 2017-03-03 23:38:49 · 819 阅读 · 0 评论 -
代理模式-rmi
package M_Proxy.rmi;import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject;/** * 1:制作远程接口 定义接口继承remote, 声明所有方法原创 2017-03-03 23:39:45 · 335 阅读 · 0 评论 -
复合模式
package N_Composite.duck;import N_Composite.duck.adapter.Goose; import N_Composite.duck.adapter.GooseAdapter; import N_Composite.duck.composite_iterator.Flock; import N_Composite.duck.decker.QuackCo原创 2017-03-03 23:41:10 · 377 阅读 · 0 评论 -
复合模式-MVC
package N_Composite.mvc;import javax.swing.*;public class BeatBar extends JProgressBar implements Runnable { private static final long serialVersionUID = 2L; JProgressBar progressBar; T原创 2017-03-03 23:42:27 · 293 阅读 · 0 评论 -
复合模式-webMVC
package N_Composite.web_mvc;import javax.servlet.*; import javax.servlet.http.*; import java.io.*;public class DJViewServlet extends HttpServlet {private static final long serialVersionUID = 2L;publi原创 2017-03-03 23:43:29 · 298 阅读 · 0 评论 -
单例模式-多线程解决方案2
package E_Singleton.thread;/** * 多线程解决方案2:不采用延迟实例化 * * @author Administrator * */ public class Singleton2 { private static Singleton2 uniqueInstance = new Singleton2();private Singleto原创 2017-02-23 13:56:25 · 367 阅读 · 0 评论 -
单例模式-多线程解决方案3
package E_Singleton.thread;/** * 多线程解决方案3:双重检查加锁 * * @author Administrator * */ public class Singleton3 { // volatile:线程在每次使用变量的时候,都会读取变量修改后的最的值。 private volatile static Singleton3 uniq原创 2017-03-04 00:08:37 · 302 阅读 · 0 评论 -
模板方法模式-用模板方法排序
package I_Template.b;import java.util.Arrays;/** * 用模板方法排序 */ public class Main { public static void main(String[] args) { Duck ducks[] = { new Duck(“1”, 1), new Duck(“2”, 4), new Du原创 2017-02-23 14:11:00 · 793 阅读 · 0 评论 -
模板方法模式-swing
package I_Template.swing;import java.awt.Graphics; import java.awt.HeadlessException;import javax.swing.JFrame;/** * swing */ public class MyFrame extends JFrame { //update是模板方法 public原创 2017-02-23 14:11:45 · 417 阅读 · 0 评论 -
模板方法模式
package I_Template.a;/** * 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤 * 优点: * 代码复用最大化 算法存在一个地方, * 容易修改 * 由算法类主导一切,拥有算法且保护算法 * 方便扩展 *原创 2017-02-23 14:10:19 · 294 阅读 · 0 评论 -
观察者模式
package b_Observer;public class CurrentConditionsDisplay implements Observer, DisplayElement { private float temperature; private float humidity; private Subject weatherData;//取消注册时有这个引用原创 2017-02-23 13:41:13 · 324 阅读 · 0 评论 -
观察者模式-swing
package b_Observer.swing;import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JButton; import javax.swing.JFrame;public class Swin原创 2017-02-23 13:43:45 · 430 阅读 · 0 评论 -
观察者模式-jdk
package b_Observer.jdk;import java.util.Observable; import java.util.Observer;interface DisplayElement { void display(); }public class CurrentConditionsDisplay implements Observer, DisplayElemen原创 2017-02-23 13:44:14 · 329 阅读 · 0 评论 -
装饰者模式
package C_Decker;/** * 设计原则:类应该对扩展开放,对修改关闭。 * 装饰者模式:动态地将责任和行为附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 * * 装饰者模式特点: * 1:装饰者和被装饰对象有相同的超类型。 * 2:可以用一个或多个装饰者包装一个对象。 * 3:既然装饰者和被装饰对象有相同的超类型,所以在任何需要原原创 2017-02-23 13:45:01 · 266 阅读 · 0 评论 -
工厂模式-A
package D_Factory.a;/** * 只适用一个地区的披萨店,当在别地建立披萨店时,由于地区口味差异,一个工厂无法满足。 解决方案,根据地区建立多个工厂 * */ public class SimplePizzaFactory { public Pizza createPizza(String type) { Pizza pizza = nul原创 2017-02-23 13:49:22 · 269 阅读 · 0 评论 -
工厂模式-B
package D_Factory.b;/** * 简单工厂模式 * 建立多个工厂解决披萨店地区差异问题 * 由于做披萨做法有差异,使用其他厂商的盒子等等 */ public class Main {public static void main(String[] args) { // 工厂创建纽约风味的披萨 NYPizzaFactory nyPizzaFactor原创 2017-02-23 13:50:14 · 332 阅读 · 0 评论 -
工厂模式-C-工厂方法
package D_Factory.c;/** *工厂方法模式: 定义一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类 *依赖倒置原则:要依赖抽象,不要依赖具体类,不能让高层组件依赖底层组件,高层和底层都应该依赖于抽象 *在应用工厂方法之后,高层组件(pizzaStore)和底层组件(具体的pizza类)都依赖Pizza抽象,遵循了此原则 *指导方原创 2017-02-23 13:51:08 · 531 阅读 · 0 评论 -
工厂模式-D- 抽象工厂模式
package D_Factory.d;public class CheesePizza extends Pizza { PizzaIngredientFactory ingredientFactory;public CheesePizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = in原创 2017-02-23 13:52:00 · 347 阅读 · 0 评论 -
单例模式
package E_Singleton; /** * 单例模式:确保一个类只有一个实例,并提供一个全局访问点 * 管理共享的资源如:线程池,注册表设置,数据库连接池 * 如果使用多个类加载器,会导致单例失效而产生多个实例 * 解决方案:自行指定类加载器,并指向同一个类加载器 * 全局变量缺点 * 不能确保只有一个实例 * 变量过多导致命名空间污染原创 2017-02-23 13:55:41 · 279 阅读 · 0 评论 -
命令模式
package F_Command.a;/** * 命令模式:将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作 * 场景:队列请求(线程从队列中一个个删除命令对象,然后调用命令对象的execute方法),线程池,日程安排,事务系统(日志回滚) */ public class Main {public static void main(Str原创 2017-02-23 14:03:03 · 274 阅读 · 0 评论 -
命令模式-宏命令+状态撤销
package F_Command.b;/** * 宏命令以及状态撤销 * CeilingFan:可撤销状态 */ public class Main { public static void main(String[] args) { RemoteControl remote = new RemoteControl(); Light li原创 2017-02-23 14:04:52 · 1877 阅读 · 0 评论 -
适配器模式
package G_Adapter.a;/** *适配器模式:将一个类的接口(或多个类),转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间 *对象适配器 * 使用对象组合,以修改的接口包装被适配者 * 被适配者的任何子类都可以搭配适配器使用 *类适配器 * 使用多重继承 * 通过扩展2个类,适配器使得火鸡可以响应鸭原创 2017-02-23 14:07:25 · 268 阅读 · 0 评论 -
适配器-迭代器
package G_Adapter.b;import java.util.Enumeration; import java.util.Iterator;public class EnumerationIterator implements Iterator { Enumeration enu;public EnumerationIterator(Enumeration enu) {原创 2017-02-23 14:07:38 · 306 阅读 · 0 评论 -
外观模式-Car(最少知识原则)
package H_Appearance;/** * 外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用 * 简化接口时,依然将系统完整的功能暴露出来,供给需要的人用。将客户从组件的子系统中解耦 * 如果变得复杂,有太多的朋友牵涉其中,可以增加更多的外观,将子系统分成几个层次 * 设计原则:最少知识原则,只和你的密原创 2017-02-23 14:08:45 · 456 阅读 · 0 评论 -
策略模式
package A_Strategy;/** * 策略模式 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 * 优点:鸭子的行为被封装到了一组类中,可以轻易扩展以及改变,以及在运行时也可以改变行为 * * 解决复用问题 1:分开变化和不变化的部分。 2:建立2组类(完全原理Duck类),fly相关类/quack相关类,每一组类实现各自的动原创 2017-02-23 13:40:08 · 290 阅读 · 0 评论