引子

设计模式是很多程序员总结出来的最佳实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种设计模式,但潜移默化的写出来公认的最佳实践代码,毕竟看的比较清爽。为什么再看一遍设计模式,主要有几个原因:第一,很多优秀的源码基本都使用了设计模式,明确设计模式能够更好的看源码。第二,很多中间件设计理念也是基于设计模式的,还有其他的语言,都有自己的设计最佳实践。对于我来说,设计模式始于java,不止于java。第三,有了这种规范,可以更好的和他人沟通,言简意赅。

设计模式原则

很多优秀的文章和书籍都讲的很明白了,我说下自己的体会。

1.单一职责原则,就是一个类只负责做一件事情。这样就可以做到解耦合的效果,让代码看起来比较清爽,也体现了java的封装性。还有个原则叫迪米特法则,就是一个对象对另一个对象有尽量少的了解,说的也是解耦合的事情。

2.里氏替换原则和依赖导致原则,说的是继承的事情。父类可以做的事情,子类都可以去做,子类可以尽量去依赖父类去做事情;但是反过来,父类不能依赖子类去做一些事情。体现了java的继承特性。

3.接口隔离原则,接口也应该尽可能的隔离开来。其实类写多了,的确耦合性低,为了让他们交流起来,用的最多的就是接口,毕竟只需要知道做什么,怎么做,去访问那个具体的类吧。

4.开闭原则,对修改关闭,对拓展开放。就是代码需要有很好的延展性,对原有代码结构不能破坏。

创建者模式

创建者模式就是为了用优雅的方式创建我们使用的类。

1.简单工厂模式

这个用的比较少,就是有个工厂,告诉你我要什么东西,你造好了给我就行。比如说:

  1. public interface Ball {
  2. public String create();
  3. }
  1. public class Soccer implements Ball {
  2. @Override
  3. public String create() {
  4. return "give you a soccer";
  5. }
  6. }
  1. public class BasketBall implements Ball {
  2. @Override
  3. public String create() {
  4. return "give you a basketBall";
  5. }
  6. }
  1. public class EasyBallFactory {
  2. public static Ball createBall(String name){
  3. if (name.equals("basketball")){
  4. return new BasketBall();
  5. }else if(name.equals("soccer")){
  6. return new Soccer();
  7. }else {
  8. return null;
  9. }
  10. }
  11. public static void main(String[] args) {
  12. Ball soccer = EasyBallFactory.createBall("soccer");
  13. Ball basketBall = EasyBallFactory.createBall("basketball");
  14. System.out.println(soccer.create()); //give you a soccer
  15. System.out.println(basketBall.create()); //give you a basketBall
  16. }
  17. }

2.工厂模式

这个其实和简单工厂模式差不太多,就是将工厂继续拆分,比如说刚刚EasyBallFactory是一个总工厂,我们现在拆分成SoccerFactory和BasketBallFactory分别生产足球和篮球。某个工厂内部可以根据需求生产不同的产品,比如说soccer可以生产不同大小的出来。

  1. public interface BallFactory {
  2. public Ball create();
  3. }
  1. public class SoccerFactory implements BallFactory {
  2. @Override
  3. public Ball create() {
  4. //do something
  5. return null;
  6. }
  7. }
  8. public class BasketBallFactory implements BallFactory {
  9. @Override
  10. public Ball create() {
  11. //do something
  12. return null;
  13. }
  14. }

3.抽象工厂模式

抽象工厂模式主要设计产品组的概念,就是某一个工厂生产出配套的一系列产品。例如,在生产足球的同时,SoccerFactory还可以生产与之配套的足球杂志。

  1. public interface Journal {
  2. public String create();
  3. }
  4. public class SoccerJournal implements Journal{
  5. @Override
  6. public String create() {
  7. return "give you a Soccer Journal...";
  8. }
  9. }
  10. public class SoccerFactory implements BallFactory {
  11. @Override
  12. public Ball create() {
  13. return new Soccer();
  14. }
  15. public Journal createJournal(){
  16. return new SoccerJournal();
  17. }
  18. }

4.单例模式

单例模式有很多种形式,最佳实践应该是两重判断,保证只new出来一个。单例可以说是非常普遍的设计模式了。单例就是指在服务容器的生命周期中只能有这么一个。比如说Servlet、Spring中注入的Bean等等都是单例的。

  1. public class ShiroUtils {
  2. public static Session session;
  3. public static Session getSession() {
  4. if (session == null){
  5. synchronized(ShiroUtils.class){
  6. if (session == null){
  7. session = SecurityUtils.getSubject().getSession();
  8. }
  9. }
  10. }
  11. return session;
  12. }
  13. }

5.建造者模式

将一个复杂对象分布创建。如果一个超大的类的属性特别多,我们可以把属性分门别类,不同属性组成一个稍微小一点的类,再把好几个稍微小点的类窜起来。比方说一个电脑,可以分成不同的稍微小点的部分CPU、主板、显示器。CPU、主板、显示器分别有更多的组件,不再细分。

  1. @Data
  2. public class Computer{
  3. private CPU cpu;//cpu 是个接口,有不同实现如InterCPU AMDCPU 等等
  4. private MainBoard mainBoard;//mainBoard 是个接口,有不同的实现
  5. private DisPlayer disPlayer;//disPlayer 是个接口,有不同的实现
  6. }
  1. public abstract class Builder {
  2. abstract void buildCPU();
  3. abstract void buildMainBoard();
  4. abstract void buildDisPlayer();
  5. abstract Computer createComputer();
  6. }
  1. public class XiaoMiBuilder extends Builder{
  2. private Computer computer = new Computer();
  3. @Override
  4. void buildCPU() {
  5. computer.setCpu(new InterCPU());
  6. }
  7. @Override
  8. void buildMainBoard() {
  9. computer.setMainBoard(new AMainBoard());
  10. }
  11. @Override
  12. void buildDisPlayer() {
  13. computer.setDisPlayer(new ADisPlayer());
  14. }
  15. @Override
  16. Computer createComputer() {
  17. return computer;
  18. }
  19. }

SpringBoot实现了0配置,几乎所有的配置都写到了java代码中,大量的配置不得不让配置类采用建造者模式,这样层次比较清晰。

6.原型模式

原型模式用的比较少,用于创建重复对象。需要实现Cloneable 可以选择重写clone()方法。clone分为浅克隆和深克隆。浅克隆只是克隆引用,对象还是一个。深克隆是对象也新创建了一个,如下:

  1. @Data
  2. @Builder
  3. public class User implements Cloneable{
  4. private String name;
  5. private int age;
  6. @Override
  7. protected User clone() throws CloneNotSupportedException {
  8. return new User(this.name,this.age);
  9. }
  10. public static void main(String[] args) throws CloneNotSupportedException {
  11. User user1 = new User("pjjlt",25);
  12. User user2 = user1.clone();
  13. user1.setAge(18);
  14. System.out.println(user2.getAge()); //25
  15. }
  16. }

结构型模式

上面的设计模式可以帮助我们非常优雅的创建出来对象,下面看几个对象关系之间的模型。

7.代理模式

Spring的AOP用的是动态代理,何为动态不看了,用过Spring的小伙伴都知道吧。单纯看一下最基础代理模式是什么样的。代理就是,一个对象辅助另一个对象去做某件事,同时还可以增加一点辅助功能。例如,你买车,的确是你花钱把车买到了,但是你不可能直接去和厂家谈吧,你应该通过4S店购买,同时4S店帮助你入保险扣税等操作,最终你才得到了你想要的车。

  1. public interface Buy {
  2. public void buyCar();
  3. }
  1. public class People implements Buy {
  2. @Override
  3. public void buyCar() {
  4. System.out.println("you get a car");
  5. }
  6. }
  1. public class ProxyPeople implements Buy{
  2. private People people;
  3. public ProxyPeople(People people){
  4. this.people=people;
  5. }
  6. @Override
  7. public void buyCar() {
  8. System.out.println("4s店帮你纳税、上保险...");
  9. people.buyCar();
  10. }
  11. public static void main(String[] args) {
  12. Buy buy = new ProxyPeople(new People());
  13. buy.buyCar();
  14. }
  15. }
  16. //输出:
  17. 4s店帮你纳税、上保险...
  18. you get a car

8.适配器模式

适配器,顾名思义,是让两个不兼容的东西可以一起工作。例如插座的电源是220V,手机直接给他220V 50HZ的交流电我相信一般都会直接炸了(除了诺基亚...)手机充电器就进行了适配,将电压变小,交流电变成直流电。除了这种需要改变属性的操作(比较好说,不举例子了),适配器还用于在接口继承方面。假设一个顶级接口有一大堆方法需要实现类实现,我新写了个类只是想选择的实现一两个接口,那其他的方法我是不是都需要实现一下,即使是空实现(单纯实现,不进行任何逻辑操作),这是我们就需要一个适配器类,空实现那些方法,我的新类只需要继承这个适配器类就好了,要是想实现某个方法,只需要重写掉配置类中对应的方法就好。这种模式基本都会用到,毕竟谁的代码还没个顶级接口啊。

  1. public interface ATopIntf {
  2. public void one();
  3. public void two();
  4. public void three();
  5. }
  1. public class Adapter implements ATopIntf {
  2. @Override
  3. public void one() { }
  4. @Override
  5. public void two() { }
  6. @Override
  7. public void three() { }
  8. }
  1. public class You extends Adapter {
  2. @Override
  3. public void one() {
  4. super.one();
  5. System.out.println("one");
  6. }
  7. }

9.桥接模式

就是用于抽象化和实现化的解耦。又是解耦,貌似设计模式就是教我们如何优雅的解耦。提高了代码的拓展性,并且可以实现代码的动态切换。

最开始的Ball、Soccer、BasketBall接着用,增加新的类

  1. public class BallCut {
  2. private Ball ball;
  3. public Ball getBall() {
  4. return ball;
  5. }
  6. public void setBall(Ball ball) {
  7. this.ball = ball;
  8. }
  9. public void create(){
  10. System.out.println(ball.create());
  11. }
  12. public static void main(String[] args) {
  13. BallCut ballCut = new BallCut();
  14. ballCut.setBall(new Soccer());
  15. ballCut.create(); //give you a soccer
  16. ballCut.setBall(new BasketBall());
  17. ballCut.create(); //give you a basketBall
  18. }
  19. }

10.装饰模式

一个装饰类,在原来类的基础上增加一点功能。是不是和代理模式很像,我甚至可以将整个代码搬过来照样可以说的通的。这两个模式意思上有点差别,代理模式是原对象做不了那件事,必须让代理对象去做,主导侧重于代理对象,比如说买车。装饰模式是说,就是让原对象直接去做这件事,只是功能上增强一点,主导在于原对象。比如说炒菜的时候撒点盐。

11.外观模式

又称门面模式,就是一个门面,一个操作无需让对象知道其内部实现的复杂度,尽量让用户感知到是非常简单的。这就是为什么我们controller层尽量(或者说一定)少些业务逻辑,让controller层只是起到一个传参和通用性参数校验的功能,剩下的全交给service去做吧。我们还需要在代码中不断将“长得”特别长的代码封装成一个方法,“让处处都有好看的外观”。看一下我们曾写过的代码,这里只起到了传参的作用,究竟这个足球是怎么创建出来的,客户端不必担心。

  1. public static void main(String[] args) {
  2. Ball soccer = EasyBallFactory.createBall("soccer");
  3. System.out.println(soccer.create()); //give you a soccer
  4. }

12.组合模式

组合模式是将存在某种包含关系的数据组织在一起,典型的例子就是树状结构。例如菜单功能,一个菜单除了自己该有的属性,还可能包含子菜单,创建的时候可以使用递归的方法。

  1. @Data
  2. public class Menu{
  3. private String name;
  4. private int type;
  5. private List<Menu> childMenus;
  6. }

13.享元模式

享元模式尽可能的让用户复用已经有的对象,从而避免造成反复创建对象的资源浪费。首先就会想到数据库连接池还有String常量池,延伸一下,几乎所有和缓存有关的代码,多少都会用到享元模式。享元模式要求大部分的对象可以外部化。这边要说两个概念,享元模式对象的属性可以分为两个部分,内部状态和外部状态,内部状态是指不会随环境而改变的值,比如说个人信息,外部状态是指随环境改变的值,不能进行共享的信息,如某大学生选修的课程。

  1. public abstract class Flyweight {
  2. //内部状态
  3. private String name;
  4. private String age;
  5. //外部状态
  6. private final String subject;
  7. protected Flyweight(String subject) {
  8. this.subject = subject;
  9. }
  10. //行为
  11. public abstract void exam();
  12. public String getSubject() {
  13. return subject;
  14. }
  15. }
  1. public class RealFlyweight extends Flyweight {
  2. @Override
  3. public void exam() {
  4. System.out.println(this.getSubject()+" is examing...");
  5. }
  6. public RealFlyweight(String subject){
  7. super(subject);
  8. }
  9. }
  1. public class FlyweightFactory {
  2. //定义一个池子
  3. private static HashMap<String,Flyweight> pool= new HashMap();
  4. public static Flyweight getFlyweight(String subject){
  5. Flyweight flyweight =null;
  6. if (pool.containsKey(subject)){
  7. flyweight=pool.get(subject);
  8. }else {
  9. flyweight = new RealFlyweight(subject);
  10. pool.put(subject,flyweight);
  11. }
  12. return flyweight;
  13. }
  14. public static void main(String[] args) {
  15. System.out.println(pool.size());//0
  16. getFlyweight("math");
  17. System.out.println(pool.size());//1
  18. getFlyweight("english");
  19. System.out.println(pool.size());//2
  20. getFlyweight("math");
  21. System.out.println(pool.size());//2
  22. }
  23. }

行为型模式

创建了对象,对象之间有了结构关系,就要看下怎么更加优雅的相互作用了。

14.策略模式

定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换。可以说是一组算法的封装,根据客户端给出的不同要求,进行不同的运算。比如下面这个简易计算器。

  1. public interface Strategy {
  2. public int doOperation(int num1, int num2);
  3. }
  4. public class OperationAdd implements Strategy{
  5. @Override
  6. public int doOperation(int num1, int num2) {
  7. return num1 + num2;
  8. }
  9. }
  10. public class OperationSubstract implements Strategy{
  11. @Override
  12. public int doOperation(int num1, int num2) {
  13. return num1 - num2;
  14. }
  15. }
  16. public class Context {
  17. private Strategy strategy;
  18. public Context(Strategy strategy){
  19. this.strategy = strategy;
  20. }
  21. public int executeStrategy(int num1, int num2){
  22. return strategy.doOperation(num1, num2);
  23. }
  24. }
  1. public class StrategyPatternDemo {
  2. public static void main(String[] args) {
  3. Context context = new Context(new OperationAdd());
  4. System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
  5. context = new Context(new OperationSubstract());
  6. System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
  7. }
  8. }

15.观察者模式

定义了一种一对多的依赖关系,当一个对象(被观察者)状态改变的时候,所有依赖于该对象的观察者都会被通知,从而进行相关操作。很多中间件都依赖于观察者模式,例如RabbitMQ,还有那些事件驱动模型(好像node就是)。下面举个例子,被观察者是监考老师,考试时间结束,通知所有观察者学生上交试卷。

  1. @Data
  2. public class Student {
  3. private String name;
  4. public Student(String name){
  5. this.name=name;
  6. }
  7. public void dosomething(){
  8. System.out.println(getName()+"交卷了");
  9. }
  10. }
  1. public class Teacher {
  2. private Set<Student> students = new HashSet<>();
  3. public void addStudent(Student student){
  4. students.add(student);
  5. }
  6. public void removeStudent(Student student){
  7. students.remove(student);
  8. }
  9. public void doNotify(){
  10. for(Student student:students){
  11. student.dosomething();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. Teacher teacher = new Teacher();
  16. Student student = new Student("张三");
  17. Student student1 = new Student("李四");
  18. teacher.addStudent(student);
  19. teacher.addStudent(student1);
  20. teacher.doNotify();
  21. }
  22. }

16.责任链模式

责任链模式为请求创建一个接收者对象的链,对发送者和接受者进行解耦合。filter链就是责任链模式。

  1. public abstract class Handler {
  2. //下一个处理者
  3. private Handler nextHandler;
  4. public final Response handleMessage(Request request){
  5. Response response =null;
  6. if (this.getHandlerLevel().equals(request.getRequestLevel())){
  7. response = this.echo(request);
  8. }else {
  9. if (this.nextHandler!=null){
  10. //传递给下一个
  11. response = this.nextHandler.handleMessage(request);
  12. }else {
  13. response =new Response()
  14. }
  15. }
  16. return response;
  17. }
  18. public Handler getNextHandler() {
  19. return nextHandler;
  20. }
  21. public void setNextHandler(Handler nextHandler) {
  22. this.nextHandler = nextHandler;
  23. }
  24. protected abstract Level getHandlerLevel();
  25. protected abstract Response echo(Request request);
  26. }

17.模板方式模式

一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。SpringBoot为用户封装了很多继承代码,都用到了模板方式,例如那一堆XXXtemplate。

  1. public abstract class DBTemplate {
  2. abstract void open();
  3. abstract void select();
  4. abstract void close();
  5. //一个搜索模板
  6. public final void selectTemplate(){
  7. open();
  8. select();
  9. close();
  10. }
  11. }
  1. public class MysqlDB extends DBTemplate {
  2. @Override
  3. void open() {
  4. System.out.println("Mysql open...");
  5. }
  6. @Override
  7. void select() {
  8. System.out.println("Mysql select...");
  9. }
  10. @Override
  11. void close() {
  12. System.out.println("Mysql close...");
  13. }
  14. public static void main(String[] args) {
  15. DBTemplate mysql = new MysqlDB();
  16. mysql.selectTemplate();
  17. }
  18. }

18.状态模式

简单来说,就是一个对象有不同的状态,根据状态不同,可能有不同的行为。

  1. public interface State {
  2. public void doAction(Context context);
  3. }
  4. public class StartState implements State {
  5. public void doAction(Context context) {
  6. System.out.println("Player is in start state");
  7. context.setState(this);
  8. }
  9. public String toString(){
  10. return "Start State";
  11. }
  12. }
  13. public class StopState implements State {
  14. public void doAction(Context context) {
  15. System.out.println("Player is in stop state");
  16. context.setState(this);
  17. }
  18. public String toString(){
  19. return "Stop State";
  20. }
  21. }
  22. public class Context {
  23. private State state;
  24. public Context(){
  25. state = null;
  26. }
  27. public void setState(State state){
  28. this.state = state;
  29. }
  30. public State getState(){
  31. return state;
  32. }
  33. }
  34. public class StatePatternDemo {
  35. public static void main(String[] args) {
  36. Context context = new Context();
  37. StartState startState = new StartState();
  38. startState.doAction(context);
  39. System.out.println(context.getState().toString());
  40. StopState stopState = new StopState();
  41. stopState.doAction(context);
  42. System.out.println(context.getState().toString());
  43. }
  44. }

19.迭代器模式

提供一个方法,可以顺序访问一个对象内部的各个元素,不需要知道内部构造。现在基本很少自己实现迭代器了,基本成熟的框架或者强大的JDK都会给出访问的方法,比如说java中iterator。这样做主要是进一步封装对象内部的结构,让行为和结构想耦合。这个不举例子了,用过iterator这个的小伙伴应该都清楚,就是不停的next,去访问下一个元素。

20.命令模式

命令模式是将请求以命令的形式包裹在对象中,并传递给对象,调用对象寻找到处理该命令的合适的对象,并将该命令传递给相应的对象,该对象执行。简单点说就是不同请求都封装成一个对象,不同的请求调用不同的执行者。

  1. //真正干活的对象
  2. public class Receiver {
  3. public void doSomething(){
  4. System.out.println("Receiver干活");
  5. }
  6. }
  1. //命令对象
  2. public abstract class Command {
  3. public abstract void exectue();
  4. }
  1. //命令实现类
  2. public class ConcreteComand extends Command{
  3. //干活那个
  4. private Receiver receiver;
  5. public ConcreteComand(Receiver receiver) {
  6. this.receiver = receiver;
  7. }
  8. @Override
  9. public void exectue() {
  10. this.receiver.doSomething();
  11. }
  12. public static void main(String[] args) {
  13. Receiver receiver = new Receiver();
  14. Command command =new ConcreteComand(receiver);
  15. command.exectue();//Receiver干活
  16. }
  17. }

21.备忘录模式

相当于做一个快照,在不破坏对象本身结构的情况下,记录对象的一个状态,合适的时候可以恢复到这种状态。数据库做事务回滚的时候就用了这种方式。这里需要注意的是,对象不与备忘录本身耦合,而是跟备忘录管理类耦合(就是List<备忘录>),这个好理解,毕竟快照不止一个嘛。

  1. @Data//备忘录
  2. public class Memento {
  3. private String state;
  4. }
  5. @Data //某对象
  6. public class Originator {
  7. private String state;
  8. public Memento saveStateToMemento(){
  9. return new Memento(state);
  10. }
  11. public void getStateFromMemento(Memento Memento){
  12. state = Memento.getState();
  13. }
  14. }
  15. //备忘录管理类
  16. public class CareTaker {
  17. private List<Memento> mementoList = new ArrayList<Memento>();
  18. public void add(Memento state){
  19. mementoList.add(state);
  20. }
  21. public Memento get(int index){
  22. return mementoList.get(index);
  23. }
  24. public static void main(String[] args) {
  25. Originator originator = new Originator();
  26. CareTaker careTaker = new CareTaker();
  27. originator.setState("State #1");
  28. originator.setState("State #2");
  29. careTaker.add(originator.saveStateToMemento());
  30. originator.setState("State #3");
  31. careTaker.add(originator.saveStateToMemento());
  32. originator.setState("State #4");
  33. System.out.println("Current State: " + originator.getState());
  34. originator.getStateFromMemento(careTaker.get(0));
  35. System.out.println("First saved State: " + originator.getState());
  36. originator.getStateFromMemento(careTaker.get(1));
  37. System.out.println("Second saved State: " + originator.getState());
  38. }
  39. }

22.访问者模式

当对特定角色进行访问的时候,需要通过访问者进行访问。一个对象不太方便被你直接访问的时候,你需要将自己的引用交给访问者,通过访问者去访问该对象。比如说,化学课,想看一个细胞结构,由于肉眼无法直接看到微观世界的玩意,需要通过显微镜间接访问。

23.中介者模式

降低对象或者说事物之间通讯的复杂性,降低耦合。比如说分布式系统中,不是需要实时反馈的操作,我们无需直接对接,只需将想做的事告诉中间件,中间件告诉另外一个系统。比如说,访问(用户点击)一条新闻操作,同时需要记录是谁访问了什么新闻,同时给新闻浏览次数加1,还要实时更新用户喜好...总之要更新n个数据库表,甚至还要操作像ES,Mongo等多个中间件数据。但是对于用户来说,我只是做了一个点击操作,希望得到的结果就是看条新闻啊,你这么多操作,搞这么慢,用户体验很差啊,而且并发量也很低,那不如做成两个小系统,A系统,拉取新闻,推送,并组装一个信息扔给MQ中间件,ok,结束,用户看到新闻。然后B系统监听,得到这个消息,进行各种更新,这里,这个中间件就是我们的中介。再比如说,MVC中的控制层就是展示层和模型层的中介。再比如说,下面这个聊天室:

  1. public class ChatRoom {
  2. public static void showMessage(User user, String message){
  3. System.out.println(new Date().toString()
  4. + " [" + user.getName() +"] : " + message);
  5. }
  6. }
  7. @Data
  8. public class User {
  9. private String name;
  10. public User(String name){
  11. this.name = name;
  12. }
  13. public void sendMessage(String message){
  14. ChatRoom.showMessage(this,message);
  15. }
  16. public static void main(String[] args) {
  17. User robert = new User("Robert");
  18. User john = new User("John");
  19. robert.sendMessage("Hi! John!");
  20. john.sendMessage("Hello! Robert!");
  21. }
  22. }

24.解释器模式

构建一种翻译方式,将某种语言或描述翻译成我们很好理解的语言或者描述。这里很好理解的意思是看得懂,看的快。本来我也想举什么编译器这种高大上的,将底层语言甚至机械语言和我们使用的高级编程语言。后来想了想,其实Map就可以看作一个很好的编译器,key你可以存放一个非常小的字符串,value理论上你可以存放任何东西,所以代码就不写了。

结束语

呜呼,废了好长的时间,终于把这些设计模式有回顾了一遍,感觉对他们其中的某些有了更深刻的理解吧。就把这篇文章当作自己的一个小字典吧,将来需要什么看什么,点看看一看,顺便可以继续丰富下内容。有些东西就该自己去记录一下,毕竟好记性不如烂笔头嘛。又快十一点了,睡觉...

好久不见,Java设计模式的更多相关文章

  1. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  2. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  3. JAVA 设计模式 桥接模式

    用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构

  4. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  5. Java设计模式之行为型模式

    行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...

  6. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  7. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. Navicat for Mysql 11.2 的下载,安装与激活

    1. Navicat for Mysql 11.2 的下载 链接:https://pan.baidu.com/s/1w54F-MYTLuy4TQwpzUE7bQ       密码:zsfu 2.下载的 ...

  2. spring aop中的propagation的7种配置

    1.前言 在声明式的事务处理中,要配置一个切面,即一组方法,如 <tx:advice id="txAdvice" transaction-manager="txMa ...

  3. idea 2018.3.4 破解

    我的idea_home=C:\Program Files\\IntelliJ IDEA 2018.3.4\ 1.下载破解文件 链接:https://pan.baidu.com/s/1I2APmk-pj ...

  4. PCB布局注意事项

    PCB布局注意事项   1.实现统一功能电路模块中的元件应采用就近集中原则,同时数字电路和模拟电路分开; 2.定位孔.标准孔等非安装孔周围1.27mm 内不得贴装元.器件,螺钉等安装孔周围3.5mm( ...

  5. 13)编写一个子类SnakeCtrl来继承基类

    1)首先是创建子类SnakeCtrl 2)     添加那个SnakeCtrl子类 3)出来了SnakeCtrl的基本样子 4)简单实现: ①改编那个SnakeCtrl.h中的内容: #pragma ...

  6. c#之初识结构(Struct)

    C# 结构(Struct) 首先结构是值类型数据结构.它使得一个单一变量可以存储各种数据类型的相关数据.struct 关键字用于创建结构.通俗说:结构就是一个可以包含不同数据类型的集合.它是一种可以自 ...

  7. Java远程调用Linux脚本

    参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813  http://blog.csdn.net/a19881029/artic ...

  8. springboot配置多个yml文件

    新接触了springboot项目,yml一大堆,启动不知道用的哪个,各种百度后: <profiles> <profile> <id>dev</id> & ...

  9. 计量经济与时间序列_关于Box-Jenkins的ARMA模型的经济学意义(重要思路)

    1 很多人已经了解到AR(1)这种最简单的时间序列模型,ARMA模型包括AR模型和MA模型两个部分,这里要详细介绍Box-Jenkins模型的观念(有些资料中把ARMA模型叫做Box-Jenkins模 ...

  10. 支付宝H5支付demo

    支付宝H5支付 首先我们必须注册一个支付宝应用(本案例就直接用支付宝的沙箱环境,这个沙箱也就是支付宝提供给开发者的一个测试环境) 登录地址:https://open.alipay.com/platfo ...