RV2-Java:常用的设计模式
创始人
2024-03-25 13:43:09
0

2.1 简介

  本文主要内容: 工厂模式、迭代器模式、适配器模式、装饰者模式、代理模式、责任链模式、观察者模式、单例模式。


2.2 软件设计的原则

  1. 单一职责原则;
  2. 里氏替换原则;
  3. 依赖倒置原则;
  4. 接口隔离原则;
  5. 迪米特原则;
  6. 开闭原则。

2.3 内容

2.3.1 工厂模式

1. 定义
  将A类对象的创建工作,完全交给B类来负责,而B类则称为工厂类,例如Mybatis的 SqlSessionFactory 与Spring的 BeanFactory


2. 代码例子:

public class Student {public Student(int i) {}
}
public class StudentFactory {public Student createStudent() {return new Student(10);}
}
public class Test {public static void main(String[] args) {Student student = new StudentFactory().createStudent();System.out.println(student);}
}

3. 优势
  1.代码解耦: 对象的创建与使用不再绑定在一起了,当我们要获取对象时,直接从工厂中拿;
  2.减少代码量: 对于一些繁琐的对象创建,我可以封装成为一个工厂。当需要创建对象时,就可以从工厂获取,减少了大部分的冗余代码。


对于设计模式的理解,还只是停留在皮毛之上,但应该明白的是,设计模式应该应对的是某些情况,而不是所有情况。

2.3.2 迭代器模式

1. 定义
  当自定义一个存储数据的容器时,应该给调用者提供一个遍历数据的工具,于是用户可以通过特定的接口,巡访容器中的每一个元素而不用了解底层的实现,最耳熟能详的例子便是集合的迭代器iterator


2. 代码例子

//链表节点类
public class Node {private Object value;//值private Node next;//下一个节点public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}
}
public class WoniuLinkedList implements Iterable{private Node head;//链表首元素private int size;//数据长度public Node getHead() {return head;}public void setHead(Node head) {this.head = head;}public void add(Object value) {Node node = new Node();node.setValue(value);Node current=head;if(current==null) {head=node;}else {while(true) {if(current.getNext()==null) {current.setNext(node);break;}else {current=current.getNext();}}}size++;}public Object get(int index) {return node(index)==null?null:node(index).getValue();}public Node node(int index) {Node current=head;for(int i=0;iif(current==null) {return null;}current=current.getNext();}return current;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}//返回一个迭代器@Overridepublic Iterator iterator() {return new WoniuLinkedListIterator(this);}}
 
//自定义迭代器
public class WoniuLinkedListIterator implements Iterator{private WoniuLinkedList list;public WoniuLinkedListIterator(WoniuLinkedList list) {this.list=list;current=list.getHead();}private Node current;@Overridepublic boolean hasNext() {//判断下一个是否存在boolean b=current==null?false:true;return b;}@Overridepublic Object next() {//返回当前这一个Node result=current;current=current.getNext();return result.getValue();}
}
 

2.3.3 适配器模式

1.定义
  百度百科显示,适配器模式指的是,将一个类的接口适配成为用户所期待的样子。

2. 代码例子

//主类
public class Master {public static void main(String[] args) {Cat cat = new Cat();Dog dog = new Dog();CatAdapter catAdapter = new CatAdapter();DogAdapter dogAdapter = new DogAdapter();ArrayList list = new ArrayList();list.add(cat);list.add(dog);ArrayList adapters = new ArrayList();adapters.add(catAdapter);adapters.add(dogAdapter);int index = (int) Math.floor(Math.random() * list.size());Object pet = list.get(index);for (Adapter adapter : adapters) {if(adapter.supports(pet)) {adapter.execute(pet);break;}}}
}
 
//适配器接口
public interface Adapter {//执行函数public void execute(Object pet);//是否支持函数public boolean supports(Object pet); 
}
//宠物猫
public class Cat {public void jump() {System.out.println("СèßäÌøµÃÕæ¸ß");}
}
//宠物猫适配器
public class CatAdapter implements Adapter{@Overridepublic void execute(Object pet) {((Cat)pet).jump();}@Overridepublic boolean supports(Object pet) {if(pet instanceof Cat) {return true;}return false;}
}
//宠物狗
public class Dog {public void run() {System.out.println("¹·×ÓÅܵÄÕæ»¶Êµ");}
}
//宠物狗适配器
public class DogAdapter implements Adapter{@Overridepublic void execute(Object pet) {((Dog)pet).run();}@Overridepublic boolean supports(Object pet) {if(pet instanceof Dog) {return true;}return false;}
}

正如菜鸟教程所言,过多地使用适配器,对于一个系统而言,无疑是一场灾难。


2.3.4 装饰器模式

1. 定义
  允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。最经典的例子便是,IO流中的字节流、字节缓冲流、对象流。


2. 代码


相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...