本帖最后由 biu波儿了罢 于 2019-7-21 20:18 编辑
需要了解的几种设计模式 1.简单工厂模式 这个用的比较少,就是有个工厂,告诉你我要什么东西,你造好了给我就行。比如说 [Java] 纯文本查看 复制代码 public interface Ball {
public String create();
}
[Java] 纯文本查看 复制代码 public class Soccer implements Ball {
@Override
public String create() {
return "give you a soccer";
}
}
[Java] 纯文本查看 复制代码 public class BasketBall implements Ball {
@Override
public String create() {
return "give you a basketBall";
}
}
[Java] 纯文本查看 复制代码 public class EasyBallFactory {
public static Ball createBall(String name){
if (name.equals("basketball")){
return new BasketBall();
}else if(name.equals("soccer")){
return new Soccer();
}else {
return null;
}
}
public static void main(String[] args) {
Ball soccer = EasyBallFactory.createBall("soccer");
Ball basketBall = EasyBallFactory.createBall("basketball");
System.out.println(soccer.create()); //give you a soccer
System.out.println(basketBall.create()); //give you a basketBall
}
}
这个其实和简单工厂模式差不太多,就是将工厂继续拆分,比如说刚刚EasyBallFactory是一个总工厂,我们现在拆分成SoccerFactory和BasketBallFactory分别生产足球和篮球。某个工厂内部可以根据需求生产不同的产品,比如说soccer可以生产不同大小的出来
[Java] 纯文本查看 复制代码 public interface BallFactory {
public Ball create();
}
[Java] 纯文本查看 复制代码 public class SoccerFactory implements BallFactory {
@Override
public Ball create() {
//do something
return null;
}
}
public class BasketBallFactory implements BallFactory {
@Override
public Ball create() {
//do something
return null;
}
}
3.抽象工厂模式 抽象工厂模式主要设计产品组的概念,就是某一个工厂生产出配套的一系列产品。例如,在生产足球的同时,SoccerFactory还可以生产与之配套的足球杂志。 [Java] 纯文本查看 复制代码 public interface Journal {
public String create();
}
public class SoccerJournal implements Journal{
@Override
public String create() {
return "give you a Soccer Journal...";
}
}
public class SoccerFactory implements BallFactory {
@Override
public Ball create() {
return new Soccer();
}
public Journal createJournal(){
return new SoccerJournal();
}
}
4.单例模式 单例模式有很多种形式,最佳实践应该是两重判断,保证只new出来一个。单例可以说是非常普遍的设计模式了。单例就是指在服务容器的生命周期中只能有这么一个。比如说Servlet、Spring中注入的Bean等等都是单例的。 [Java] 纯文本查看 复制代码 public class ShiroUtils {
public static Session session;
public static Session getSession() {
if (session == null){
synchronized(ShiroUtils.class){
if (session == null){
session = SecurityUtils.getSubject().getSession();
}
}
}
return session;
}
}
5.代理模式 Spring的AOP用的是动态代理,何为动态不看了,用过Spring的小伙伴都知道吧。单纯看一下最基础代理模式是什么样的。代理就是,一个对象辅助另一个对象去做某件事,同时还可以增加一点辅助功能。例如,你买车,的确是你花钱把车买到了,但是你不可能直接去和厂家谈吧,你应该通过4S店购买,同时4S店帮助你入保险扣税等操作,最终你才得到了你想要的车。
[Java] 纯文本查看 复制代码 public interface Buy {
public void buyCar();
}
[Java] 纯文本查看 复制代码 public class People implements Buy {
@Override
public void buyCar() {
System.out.println("you get a car");
}
}
[Java] 纯文本查看 复制代码 public class ProxyPeople implements Buy{
private People people;
public ProxyPeople(People people){
this.people=people;
}
@Override
public void buyCar() {
System.out.println("4s店帮你纳税、上保险...");
people.buyCar();
}
public static void main(String[] args) {
Buy buy = new ProxyPeople(new People());
buy.buyCar();
}
}
//输出:
4s店帮你纳税、上保险...
you get a car
6.适配器模式 适配器,顾名思义,是让两个不兼容的东西可以一起工作。例如插座的电源是220V,手机直接给他220V 50HZ的交流电我相信一般都会直接炸了(除了诺基亚...)手机充电器就进行了适配,将电压变小,交流电变成直流电。除了这种需要改变属性的操作(比较好说,不举例子了),适配器还用于在接口继承方面。假设一个顶级接口有一大堆方法需要实现类实现,我新写了个类只是想选择的实现一两个接口,那其他的方法我是不是都需要实现一下,即使是空实现(单纯实现,不进行任何逻辑操作),这是我们就需要一个适配器类,空实现那些方法,我的新类只需要继承这个适配器类就好了,要是想实现某个方法,只需要重写掉配置类中对应的方法就好。这种模式基本都会用到,毕竟谁的代码还没个顶级接口啊。
[Java] 纯文本查看 复制代码 public interface ATopIntf {
public void one();
public void two();
public void three();
}
[Java] 纯文本查看 复制代码 public class Adapter implements ATopIntf {
@Override
public void one() { }
@Override
public void two() { }
@Override
public void three() { }
}
[Java] 纯文本查看 复制代码 public class You extends Adapter {
@Override
public void one() {
super.one();
System.out.println("one");
}
}
7.装饰模式 一个装饰类,在原来类的基础上增加一点功能。是不是和代理模式很像,我甚至可以将整个代码搬过来照样可以说的通的。这两个模式意思上有点差别,代理模式是原对象做不了那件事,必须让代理对象去做,主导侧重于代理对象,比如说买车。装饰模式是说,就是让原对象直接去做这件事,只是功能上增强一点,主导在于原对象。比如说炒菜的时候撒点盐。
文章摘自:https://juejin.im/post/5d27495fe51d4556dc2936c3
|