目录

    • UML
      • 继承
      • 实现
    • 策略模式
    • 观察者模式
    • 装饰者模式
    • 工厂方法模式
    • 抽象工厂
    • 单例模式
    • 命令模式
    • 适配器模式
    • 外观模式
    • 模板方法
    • 迭代器模式
    • 组合模式
    • 状态模式
    • 代理模式
      • 静态代理
      • 动态代理
        • JDK
        • cglib
    • 建造者模式
    • 享元模式
    • 桥接模式
    • 职责链模式
    • 解释器模式
    • 中介者模式
    • 访问者模式
    • 备忘录模式
    • 原型模式

UML

继承

在这里插入图片描述

实现

矩形表示法
空心三角+虚线
在这里插入图片描述
棒棒糖表示法在这里插入图片描述
依赖
在这里插入图片描述
关联
在这里插入图片描述
聚合(has a)弱关系,有不同的生命周期
在这里插入图片描述
组合(contains a ) 强关系 ,同一生命周期
在这里插入图片描述

策略模式

设计原则:把变化的封装起来,不变的不受影响
组合比封装好
策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。UML结构图如下:

在这里插入图片描述
其中,Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算法的公共接口;ConcreteStrategy是具体策略类,封装了具体的算法或行为,继承于Strategy。

观察者模式

设计原则:松耦合
观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。再比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。
对于观察者模式而言,肯定有观察者和被观察者之分。比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。
观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。UML结构图如下:
在这里插入图片描述
其中,Subject类是主题,它把所有对观察者对象的引用文件存在了一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者对象;Observer类是抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己;ConcreteSubject类是具体主题,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知;ConcreteObserver是具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协同。
当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象有待改变的时候,应该考虑使用观察者模式。
而使用观察者模式的动机在于:将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便,而观察者模式所做的工作就是在解除耦合。
实例 java.util中的 Observer

装饰者模式

设计模式: 开闭原则
还记得我的一个长辈曾经买了一部手机,买的时候还好好的新新的,刚拿到家就坏了,怎么回事呢?其实就是一个假手机,把一个已经报废的旧机子改了改,外面加了个新壳子罢了,这就是一个装饰模式,在原有的基础上加了些东西。
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。UML结构图如下:

其中,Component是抽象构件,定义一个对象接口,可以给这些对象动态地添加职责;ConreteComponent定义一个具体对象,也可以给这个对象添加一些职责;Decorator是装饰抽象类,实现接口或抽象方法;ConreteDecorator是具体装饰对象,起到给Component添加职责的功能。
在这里插入图片描述
java IO中大量装饰者模式

工厂方法模式

设计原则:依赖倒置
工厂二字想必大家都不陌生,工厂就是用来建造东西的,我们市面上买的东西比如水杯、玩具、汽车等等都是从工厂生产的,那我们需不需要知道它们是如何生产出来的呢?当然不需要,商家从工厂中直接提货,我们就可以购买了,完全不知道它是如何生产的,这就是工厂方法模式。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。UML结构图如下:​
在这里插入图片描述
其中,Product定义工厂方法所创建的对象的接口;Creator声明工厂方法,并返回一个Product类型的对象;ConcreteProduct是具体的产品,实现了Product接口;ConcreteCreteCreator重定义工厂方法,返回一个ConcreteProduct实例。

简单工场和工厂方法模式区别:
在这里插入图片描述
在这里插入图片描述
如果现在需要增加其他运算,比如取余。简单工厂模式需要在添加case分支条件,修改了原有的类,违背了开闭原则;而工厂方法模式只需再新加个取余类和取余工厂,然后对客户端进行修改即可。
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对与客户端来说,去除了与具体产品的依赖。为了弥补他违背了开闭原则,于是就有了工厂方法模式,根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。
其实工厂方法模式还存在一个问题,就是客户端需要决定实例化哪一个工厂来实现运算类,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。对于这个问题,可以利用反射来解决(具体实例可参考抽象工厂模式中的反射实例)。

抽象工厂

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
在这里插入图片描述
抽象工厂uml
在这里插入图片描述
在这里插入图片描述

单例模式

大家学操作系统的时候应该知道,当多个进程或线程同时操作一个文件时,只有一个能访问;java中类似的例子也有很多,比如多线程中我们最常用的锁,保证了多线程同时对一个方法或对象操作时只有一个能够访问。单例模式就是如此,我们给出它的定义。
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML结构图如下:
在这里插入图片描述
懒汉式: 线程不安全

public class Singleton {private static Singleton instance;//限制产生多个对象private Singleton() {}//通过方法获取实例对象public static Singleton getInstance() {if(instance == null) {instance = new Singleton();}return instance;}}

饿汉式: 线程安全,但是提前加载资源,消耗资源

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}//类中其他方法,尽量使staticpublic static void dosomething() {}}

解决线程安全问题:

  • 懒汉式
    所谓懒汉式单例,就是通过在上述代码中增加synchronized关键字来实现。
public class Singleton {private volatile static Singleton instance;private static Object syncRoot = new Object();private Singleton() {}public static Singleton getInstance() {//双重锁定if(instance == null) {synchronized (syncRoot) {if(instance == null) {instance = new Singleton();}}}return instance;}}

这里使用了双重锁定(Double-Check Locking),这样可以不用让线程每次都加锁,而只是在实例未被创建的时候再枷锁处理,同时也能保证多线程的安全。
而这里判断了两次instance实例是否存在的原因是,当instance为null时,并且同时有两个线程调用getInstance()方法时,它们都可以通过第一重instance==null的判断,然后由于lock机制,这两个线程则只有一个进入,另一个在外排队等候,必须要其中一个进入并出来后,另一个才能进入,而此时如果没有了第二重排序,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,就没有达到单例的目的。
这里还需要注意一个问题,第三行中加入了volatile关键字,这里如果不加volatile可能会出现一个错误,即当代码读取到第11行的判断语句时,如果instance不为null时,instance引用的对象有可能还没有完成初始化,线程将访问到一个还未初始化的对象。究其原因是因为代码第14行,创建了一个对象,此代码可分解为三行伪代码,即分配对象的内存空间、初始化对象、设置instance指向刚分配的内存地址,分别记为1、2、3,在2和3之间,可能会被重排序,重排序后初始化就变为了最后一步。因此,线程A的intra-thread semantics(所有线程在执行Java程序时必须遵守intra-thread semantics,它保证重排序不会改变单线程内的程序执行结果)没有改变,但A2和A3的重排序将导致线程B判断出instance不为空,线程B接下来将访问instance引用的对象,此时,线程B将会访问到一个还未初始化的对象。而使用volatile就可以实现线程安全的延迟初始化,本质时通过禁止2和3之间的重排序,来保证线程安全的延迟初始化。

  • 静态内部类
    这种方式与饿汉式一样,同样利用了类加载来保证只创建一个instance实例,因此不存在线程安全的问题,不一样的是,它是在内部类里面去创建对象实例。这样只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式延迟加载。
public class Singleton {//静态内部类private static class SingletonHolder {public static Singleton instance = new Singleton();}private Singleton() {}public static Singleton getInstance() {return SingletonHolder.instance;}}
  • 枚举
    上面实现单例的方式都需要额外的工作来实现序列化,而且可以使用反射强行调用私有构造器。
    而枚举很好的解决了这两个问题,使用枚举除了线程安全和防止反射调用构造器外,还提供了自动序列化机制,防止反序列化的时候创建新的对象。
public enum Singleton {instance;public static void dosomething() {}}

枚举客户端:

public class Client {public static void main(String[] args) {    //枚举Singleton instance1 = Singleton.instance;Singleton instance2 = Singleton.instance;if(instance1 == instance2) {System.out.println("两个对象是相同的实例");}}}

命令模式

在说命令模式前我们先来说一个小例子。很多人都有吃夜市的经历,对于那些推小车的摊位,通常只有老板一个人,既负责制作也负责收钱,我要两串烤串多放辣,旁边的人要了三串烤面筋不要辣,过了一会儿又来人要烤蔬菜……,当人多的时候记忆力不好的老板肯定就不知道谁要的啥、交没交钱了;而去有店铺的烤肉摊,点单的时候会有服务员来记录我们的菜单,然后再去通知烧烤师傅进行烧烤,这样就不会出现混乱了,当然我们也可以随时对菜单进行修改,此时只需服务员记录后去通知烤肉师傅即可,由于有了记录,最终算账还是不会出错的。
从这里讲,前者其实就是“行为请求者”和“行为实现者”的紧耦合,对于请求排队或记录请求日志,以及支持可撤销的操作来说,紧耦合是不太合适的,而命令模式恰恰解决了这点问题。
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。UML结构图如下:
在这里插入图片描述
其中,Invoker是调用者角色,要求该命令执行这个请求;Command是命令角色,需要执行的所有命令都在这里声明,可以是接口或抽象类;Receiver是接收者角色,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者;ConcreteCommand将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Execute。
命令模式其实是把一个操作的对象与知道怎么执行一个操作的对象分隔开。至于命令模式使用时机,敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

适配器模式

适配器这个词我们应该很熟悉,天天都在使用,手机充电时,电源线头头就叫电源适配器,干什么用的呢?把220V电压转换为手机充电时使用的电压,那适配器模式是不是很好理解了,下面看一下定义。
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式有“类适配器”和“对象适配器”两种不同的形式。

  • 对象适配器
    通过对象层次的关联关系进行委托(对象的合成关系/关联关系)。UML结构图如下:
    在这里插入图片描述
  • 类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。
    由于对象适配器是通过类间的关联关系进行耦合的,因此在设计时就可以做到比较灵活,而类适配器就只能通过覆写源角色的方法进行扩展。
    在实际项目中,对象适配器使用到的场景较多
  • 装饰者模式一般有新的功能和行为加入,适配器模式一般是接口的转换。

外观模式

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。
其实本篇要说的这个设计模式就和这很有关系,由于当投资者自己买股票时,由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中就成为耦合性太高,而有了基金后,就变成众多用户只和基金打交道,关心基金的上涨和下跌,而实际上的操作确是基金经理人与股票和其它投资产品打交道,这就是外观模式。
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。UML结构图如下:
在这里插入图片描述
其中Facade是外观角色,也叫门面角色,客户端可以调用这个角色的方法,此角色知晓子系统的所有功能和责任,将客户端的请求代理给适当的子系统对象;Subsystem是子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。

模板方法

所谓模板方法模式,其实很简单,可以从模板的角度考虑,就是一个对模板的应用,就好比老师出试卷,每个人的试卷都是一样的,即都是从老师的原版试卷复印来的,这个原版试卷就是一个模板,可每个人写在试卷上的答案都是不一样的,这就是模板方法模式,是不是很好理解。它的主要用途在于将不变的行为从子类搬到超类,去除了子类中的重复代码。
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。UML结构图如下:
在这里插入图片描述
其中,AbstractClass实现类一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤;而ConcreteClass实现了PrimitiveOperation以完成算法中与特定子类相关的步骤。

public abstract class AbstractClass {public abstract void PrimitiveOperation1();public abstract void PrimitiveOperation2();public void TemplateMethod() {PrimitiveOperation1();PrimitiveOperation2();}}

迭代器模式

组合模式

状态模式

状态这个词汇我们并不陌生,在日常生活中,不同时间就有不同的状态,早上起来精神饱满,中文想睡觉,下午又渐渐恢复,晚上可能精神更旺也可能耗费体力只想睡觉,这一天中就对应着不同的状态。或者对软件开发人员更形象的描述可能是UML的状态图(即用于描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应)。
其实相对来说,就是一种状态的变化,而状态模式主要解决的问题就是当控制一个对象状态转换的条件表达式过于复杂时的情况。即把状态的判断逻辑转移到标识不同状态的一系列类当中。
状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。UML结构图如下:
在这里插入图片描述
其中,Context类为环境角色,用于维护一个ConcreteState子类的实例,这个实例定义当前的状态;State为抽象状态角色,定义一个接口以封装与Context的一个特定接口状态相关的行为;ConcreteState是具体状态角色,每一个子类实现一个与Context的一个状态相关的行为。

代理模式

关于代理模式,我们听到的见到的最多的可能就是静态代理、动态代理之类的,当然还有大家都知道的Spring Aop,这里我们先不谈这些个代理,先说个简单的例子。游戏代练应该都听说过,许多人肯定也找过代练,曾经DNF、LOL、COC等等游戏的代练很多,当然现在各类游戏层出不穷,也都有各种代练,那这里所谓的代练是什么?就是Proxy,也即代理类,那游戏代练这件事就是一个代理模式。
如果觉得不好理解可以这么想,代练的流程是,你把自己的账号交给代练人员,让他们帮你打怪升级,而你只需要提供账号即可。那代练人员那边,他所要做的就是登陆你的账号,然后替你打游戏,从第三者的角度来看,你这个角色在打怪升级,但这个第三者并不知道是不是你本人在打游戏,他只能看到你这个账号正在打怪升级,但并不需要知道后面打游戏的是谁。这就是代理模式,由他人代理玩游戏。
如果觉得这个还不好理解,那再说一个例子。假设我现在要邀请明星来上节目,我是直接给这个明星打电话吗?当然不是,是给他的经纪人打电话,然后再由经纪人通知到该明星,这里经纪人充当的就是代理的角色。
更常见的例子就是Windows的快捷方式,通过快捷方式,我们可以访问某个文件夹下的exe文件,这就是一个典型的代理模式,它将接口,按上面游戏的说法说就是代练的账号,提供了出来,我们只需点击快捷方式,它会帮我们运行指定目录下的指定程序。说了这么多,现在来看一下代理模式的定义。

静态代理

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。UML结构图如下:
在这里插入图片描述
其中,Subject是主题角色,定义了RealSubject和Proxy的共同接口;RealSubject是具体主题角色,定义了Proxy所代表的真实实体;Proxy为代理主题角色,保存一个引用使代理可以访问实体,并提供一个与Subject的接口相同的接口。

  • Subject抽象类
    定义了RealSubject和Proxy的共同接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
public abstract class Subject {public abstract void request();}
  • RealSubject类
    定义了Proxy所代表的真实实体。
public class RealSubject extends Subject {@Overridepublic void request() {System.out.println("真实的请求RealSubject");}}
  • Proxy类
    代理类。一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理哪个真实主题角色,是由场景类决定的。
public class Proxy extends Subject {private RealSubject realSubject = null;public Proxy() {this.realSubject = new RealSubject();}@Overridepublic void request() {this.before();this.realSubject.request();this.after();}//预处理private void before() {System.out.println("-------before------");}//善后处理private void after() {System.out.println("-------after-------");}
}
  • Client客户端
public class Client {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.request();}}

总结一下就是,在代理类中注入依赖,即引入需要代理的实体类,通过代理类来调用实体类中的方法来实现静态代理。
静态代理由我们自己去生成固定的代码进行编译。需要定义接口或抽象的父类作为抽象目标类,具体目标类和代理类一起实现相同的接口或继承相同的类,然后通过调用相同的方法来调用目标对象的方法。
静态代理需要目标对象和代理对象实现相同的接口。可以在不修改目标对象功能的前提下,对目标功能进行扩展。
虽然静态代理可以很好的对目标对象进行功能扩展,但对每一个服务都需要建立代理类,工作量较大且不易管理,而且如果接口发生改变的话,代理类也得进行相应的修改,这时动态代理的作用就显现出来了。

动态代理

JDK

动态代理与静态代理的区别在于:在程序运行时,动态代理类是运用反射机制创建而成的。在抽象工厂模式的最后有提到用反射来代理switch语句进行选择,这里就运用到了类似的思想。
通过动态代理,我们不再需要手动创建代理类,只需编写一个动态处理器即可,而真正的代理对象由JDK在运行时帮我们创建。所以我们也将之称为JDK动态代理。
方法步骤如下:
1.写一个代理类实现InvocationHandler接口,通过构造函数把代理对象(具体目标类)传入到此处理器中,在invoke()方法中增加method.invoke(realSubject, args)
2.在调用方法时,通过java.lang.reflect.Proxy和newProxyInstance()来获取代理实现类,生成代理对象时,直接调用方法即可。
下面看一个例子,UML结构图如下:
在这里插入图片描述
1. IBusiness接口
被代理的接口。

 public interface IBusiness {public void doWork();}

2. Business类
具体实现类/被代理的对象。

public class Business implements IBusiness {@Overridepublic void doWork() {System.out.println("进行业务逻辑处理");}}

3. BusinessHandler类
BusinessHandler类实现类Invocation接口,它是方法调用接口,声明了负责调用任意一个方法的invoke()方法,参数proxy指定动态代理类实例,参数method指定被调用的方法,参数args指定向被调用方法传递的参数,而invoke()方法的返回值表示被调用方法的返回值。其中 method.invoke(iBusiness, args) 相当于 iBusiness.method(args) 。

  public class BusinessHandler implements InvocationHandler {private IBusiness iBusiness;public BusinessHandler(IBusiness iBusiness) {this.iBusiness = iBusiness;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before");method.invoke(iBusiness, args);System.out.println("after");return null;}}

4. Client客户端

  public class Client {public static void main(String[] args) {Business business = new Business();//生成代理类对象IBusiness proxy = (IBusiness) Proxy.newProxyInstance(business.getClass().getClassLoader(), business.getClass().getInterfaces(), new BusinessHandler(business));proxy.doWork();}}

此处通过java.lang.reflect.Proxy类的newProxyInstance()方法来生成代理类对象,它的完整定义如下:

 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException

参数loader指定动态代理类的类加载器,参数interfaces指定动态代理类需要实现的所有接口,参数handler指定与动态代理类相关联的InvocationHandler对象。所以我们只需调用newProxyInstance()方法就可以某一个对象的代理对象了。(有关ClassLoader类加载器的内容这里就不再赘述了,它的作用是将class文件加载到jvm虚拟机中去)。
相比于静态代理,动态代理的优势还是很明显的,不仅减少了对业务接口的依赖,还降低了耦合度,但它还是无法摆脱对接口的依赖。那么对于没有接口的类应该如何实现动态代理呢?

cglib

cglib是一个强大的高性能代码生成包,底层是通过使用一个小而快的字节码处理框架ASM来转换并生成新的类,所以我们一般也称之为cglib字节码生成。
与JDK动态代理不同,cglib是针对类来实现代理的,所以对于没有接口的类我们可以通过cglib字节码生成来实现代理。原理是对指定的业务类生成一个子类,并覆盖其中的业务方法实现代理。但因为采用的是继承,所以不能对final修饰的类进行代理。
下面看一个使用cglib进行代理的实例,需先导入相应的jar包(asm及cglib包)。
方法步骤如下:
1.创建被代理类,创建拦截器(实现MethodInterceptor)
2.实现Enhancer工具类,允许为非接口类型创建一个Java代理
3.使用setSuperclass()方法设置父类
4.使用setCallback()方法设置回调函数(默认执行intercept方法)
5.使用create()方法创建子类
1. 被代理类
首先定义业务类,无需实现接口。

 public class Hello {public void sayHello() {System.out.println("Hello World!");}}

2. 拦截器
定义一个拦截器,通过实现MethodInterceptor接口的intercept()方法来实现回调方法,通过invokeSuper()执行目标对象的方法。

public class HelloMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object object, Method method , Object[] objects , MethodProxy methodProxy ) throws Throwable {System.out.println("before " + method.getName());methodProxy.invokeSuper(object, objects);System.out.println("after " + method.getName());return null;}}

3. Client客户端
通过Enhancer加强类来创建动态代理类,通过它的setSuperclass()方法来指定要代理的业务类(即为下方生成的代理类指定父类),然后通过create()方法生成代理类对象。
在enhance.create()创建完代理对象后,在代理类调用方法中,会被我们实现的方法拦截器HelloMethodInterceptor拦截。如果被代理类被final修饰,则该类不能被继承,即不能被代理;同样,如果被代理类存在final修饰的方法,则该方法不能被代理。

  public class Client {public static void main(String[] args) {Enhancer enhancer = new Enhancer();        //工具类enhancer.setSuperclass(Hello.class);    //继承被代理类enhancer.setCallback(new HelloMethodInterceptor());        //设置回调Hello hello = (Hello) enhancer.create();    //生成代理类对象hello.sayHello();}}

综上所述,cglib采用的是动态创建子类的方法,所以对final修饰的类不能进行代理。以Spring AOP编程为例,JDK动态代理及cglib代理的区别在于,有接口的目标对象采用JDK代理,无接口的目标对象采用cglib代理。
使用cglib的前提条件为:

  • 需要引入cglib的jar文件
  • 目标类不能为final
  • 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法

建造者模式

我们先说一个生活中的小例子,当我们在外面饭店吃饭时,比如点个水煮肉片,这家店可能会辣一点、那家店可能会咸一点、对面那家可能放青菜、隔壁那家可能放菠菜,每家店做出来的都不一样,明明都是水煮肉片却有不同的做法,如果都一样就不会说这家难吃那家好吃了。那再看快餐店,比如KFC,我们点个至尊虾堡,所有人不管在哪个城市哪家店,做法、味道都是一样的,为什么呢,因为它用料、时间、温度等等都是严格规定的,我们只需要下订单就行了,这就是一个建造者模式。
建造者模式(Builder),将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML结构图如下:
在这里插入图片描述
其中,Director为指挥者/导演类,负责安排已有模块的顺序,然后告诉Builder开始建造;Builder是抽象建造者,规范产品的组建,一般由子类实现;ConcreteBuilder是具体建造者,实现抽象类定义的所有方法,并且返回一个组建好的对象;Product是产品类,通常实现了模板方法模式。

  • 与工厂模式的区别
    建造者模式更关注于零件装配的顺序
  • 应用实例
    KFC的食品制作流程,原料多少克、加热几分钟等都有严格的规定,我们只需点餐即可,无论在哪里点的都是一样的。
    去KFC吃汉堡、薯条、炸鸡等,这些单品是不变的,其组合是经常改变的,也就是所谓的“套餐”。
    Java中的StringBuilder/StringBuffer。

享元模式

说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。
比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象“adam“,下次再创建相同的字符串”adam“时,只是把它的引用指向”adam“,这样就实现了”adam“字符串再内存中的共享。
举个最简单的例子,网络联机下棋的时候,一台服务器连接了多个客户端(玩家),如果我们每个棋子都要创建对象,那一盘棋可能就有上百个对象产生,玩家多点的话,因为内存空间有限,一台服务器就难以支持了,所以这里要使用享元模式,将棋子对象减少到几个实例。下面给出享元模式的定义。
在这里插入图片描述
其中,Flyweight是抽象享元角色。它是产品的抽象类,同时定义出对象的外部状态和内部状态(外部状态及内部状态相关内容见后方)的接口或实现;ConcreteFlyweight是具体享元角色,是具体的产品类,实现抽象角色定义的业务;UnsharedConcreteFlyweight是不可共享的享元角色,一般不会出现在享元工厂中;FlyweightFactory是享元工厂,它用于构造一个池容器,同时提供从池中获得对象的方法。关键代码:用 HashMap 存储这些对象.

桥接模式

桥接模式,又叫桥梁模式,顾名思义,就是有座“桥”,那这座桥是什么呢?就是一条聚合线(下方UML图),比如我们下面会举的例子,手机有手机品牌和手机游戏等等,每个手机品牌都有多款游戏,那是不是二者之间就是聚合关系了,这是合成/聚合复用原则的体现,当我们发现类有多层继承时就可以考虑使用桥接模式,用聚合代替继承。
桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。UML结构图如下:
在这里插入图片描述
其中,Abstraction为抽象化角色,定义出该角色的行为,同时保存一个对实现化角色的引用;Implementor是实现化角色,它是接口或者抽象类,定义角色必需的行为和属性;RefinedAbstraction为修正抽象化角色,引用实现化角色对抽象化角色进行修正;ConcreteImplementor为具体实现化角色,实现接口或抽象类定义的方法或属性。
在这里插入图片描述
这里用到的合成/聚合复用原则是一个很有用处的原则,即优先使用对象的合成或聚合,而不是继承。究其原因是因为继承是一种强耦合的结构,父类变,子类就必须变。

职责链模式

从文字角度出发,我们可以先将关注点放在“链”字上,很容易联想到链式结构,举个生活中常见的例子,击鼓传花游戏就是一个很典型的链式结构,所有人形成一条链,相互传递。而从另一个角度说,职责链就是所谓的多级结构,比如去医院开具病假条,普通医生只能开一天的证明,如果需要更多时常,则需将开具职责转交到上级去,上级医师只能开三天证明,如需更多时常,则需将职责转交到他的上级,以此类推,这就是一个职责链模式的典型应用。再比如公司请假,根据请假时常的不同,需要递交到的级别也不同,这种层级递进的关系就是一种多级结构。
职责链模式(Chain Of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。UML结构图如下:
在这里插入图片描述
其中,Handler是抽象处理者,定义了一个处理请求的接口;ConcreteHandler是具体处理者,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则就将该请求转发给它的后继者。
抽象处理者实现了三个职责:
定义一个请求的处理方法handlerMessage(),是唯一对外开放的方法
定义一个链的编排方式setNext(),用于设置下一个处理者
定义了具体的请求者必须实现的两个方法,即定义自己能够处理的级别的getHandlerLevel()方法及具体的处理任务echo()方法

public abstract class Handler {private Handler nextHandler;    //下一个处理者public final Response handlerMessage(Request request) {Response response = null;if(this.getHandlerLevel().equals(request.getRequestLevel())) {    //判断是否是自己的处理级别response = this.echo(request);} else {if(this.nextHandler != null) {    //下一处理者不为空response = this.nextHandler.handlerMessage(request);} else {//没有适当的处理者,业务自行处理}}return response;}//设定下一个处理者public void setNext(Handler handler) {this.nextHandler = handler;}//每个处理者的处理等级protected abstract Level getHandlerLevel();//每个处理者都必须实现的处理任务protected abstract Response echo(Request request);}

解释器模式

中介者模式

mvc中的c(controller)就是“中介者”。

访问者模式

备忘录模式

原型模式

cloneable接口
浅拷贝

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 用Python做跳一跳外挂太浪费了,这种技能让你目瞪口呆

    小编现在每天思考最多的问题就是到底什么时候能发财啊!!!再看看每个月工资卡里的钱真的是只能以45度角仰望天空一直以来,年底都是离职的高峰期嗑着瓜子,刷着51job 学习Python也有几个月了,该考虑换工作啦,看了眼招聘网站,就像这样~信息玲琅满目不知该怎么办了,这时候,…...

    2024/5/4 4:50:59
  2. 编程语言学习概要与学习方法

    启程——本文逐渐完善中...三个普适性主题:系统的问题解决方式,抽象能力,以及将计算思维作为思考世界的一种方式。应当学会以下技能初级技能使用语言进行编程与计算学会系统性地组织编写调试中等规模的程序;理解算法复杂度将模糊的问题转化为明确的计算方法,以此解决问题,…...

    2024/5/4 1:31:14
  3. solr dataimport

    full-import : "完全导入"这个操作可以通过访问http://10.108.109.196:8080/solr/core0/dataimport?command=full-import完成。 这个操作,将会新起一个线程。response中的attribute属性将会显示busy。 这个操作执行的时间取决于数据集的大小。 当这个操作运行完了以…...

    2024/4/17 5:53:40
  4. H5 游戏主流引擎和编程语言

    引言: 最近微信新版本,主推小程序中的小游戏模块,一个 “跳一跳” 的 H5 游戏瞬间爆火,虽然很多传言说 H5 真正盈利的时机未到,因为它的突出作品大多是简单的小游戏,好玩但不吸引付费。然而,H5 游戏巨大流量和强大的日活跃还是可以转化为利润的。最近也是公司想将一个 U…...

    2024/5/4 5:39:43
  5. 你不知道的JAVASCRIPT:作用域和闭包

    LHS 和 RHS 的含义是“赋值操作的左侧或右侧”并不一定意味着就是“=赋值操作符的左侧或右侧”。赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查…...

    2024/5/3 23:37:40
  6. C++编程学习52个经典网站 强力推荐

    C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。 1、h…...

    2024/4/22 20:40:17
  7. Socket网络编程——(一)

    什么是Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。端点由IP地址和端口号共同组成,简单的说它是IP地址和端口结合的协议。 常用的套接字 流式套接字:流套接字用于提供面向连接、可靠的数据传输服务,该服务将保证数据能够实…...

    2024/4/17 5:54:52
  8. Solr dataimport 无法导入数据

    今天用Solr 6,6碰到个巨坑,dataimport mysql中的数据,从Solr 4.10中移植过来配置(4.10 ik智能分词不好使),导入显示成功,但是怎么搜都没数据,solrj方式添加也提示成功,但是搜不到数据,但是可以查到数据,说明问题出在Solr系统方面,最后发现是前台UI导致的,切回老版本即可....

    2024/4/25 10:28:59
  9. 基于神经网络的音乐流派分类

    介绍本文讨论神经网络对声音样本的音乐类型进行分类的任务。当我决定在声音处理领域工作时,我认为声音类型分类和图像分类是相同的问题。但是图像非常火热,我并没有找到太多关于深度学习来解决这个问题的相关资料。直到最近我找到一个关于使用深度学习技术的基于内容的音乐推…...

    2024/4/11 11:42:13
  10. EAS BOS webservice 调用原理

    以采购入库单为例: 可以解压scm_im-server.jar 得到源码: 1、 WSPurInWarehsBillFacadeSrvProxy代理 2、 WSPurInWarehsBillFacadeSrvProxy 调用IPurInWarehsBillFacade接口,String[] importData(String paramString) 3、 PurInWarehsBillFacade实现,IPurInWarehsBillFa…...

    2024/4/27 18:47:34
  11. socket网络编程基础篇

    首先列举一下socket网络通信的例子:使用局域网打游戏,用浏览器连接外网看视频,使用QQ与好友通信,手机连接wifi传数据等等。socket是底层抽象给应用层所使用的一套接口函数,本篇讲解这些函数的使用。对象:1、服务器server(等待客户端连接)2、客户端client(主动连接服务…...

    2024/4/20 13:43:34
  12. 如何开发一款报表引擎(一) 框架梳理

    最近大佬跟我说,你来开发一款报表引擎,不要多复杂,只要实现这些功能就行;当时我内心惶恐,因为光是理解这个引擎我就觉得挺费劲,毕竟跟我之前开发的东西不太一样,但是这件事情大佬发话了,那就是要想办法去倒腾倒腾,搞得成就提出来能搞,搞不出也得告诉人家为啥搞不成,…...

    2024/4/18 2:55:33
  13. SSM框架学习与问题记录

    SSM+Maven学习笔记整理(持续更新...)最终目标:搭建一个简单的管理系统学习目的:熟悉巩固java基础知识,熟悉ssm框架使用,熟悉maven使用笔记作用:即便是参考博客开发,仍然遇到一个接一个的问题,所以需要记录一下学习过程中遇到的耗时较长的问题,以后再次遇到的话,可以参…...

    2024/4/17 5:53:52
  14. 学习3D引擎架构技术概述

    近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程以及优化就感到头疼,长此以往对自己技术提升非常不利的。要改变…...

    2024/4/17 5:54:40
  15. SAS导入csv文件乱码解决办法

    我们现在有一个csv文件,而且文件比较大,有80M左右。 我们使用下面的语句来导入csv文件option compress = yes validvarname = any; libname dp "D:\da";PROC IMPORT datafile=D:\da\approval.csv OUT=work.approval DBMS=csv REPLACE; Delimiters=",";…...

    2024/4/20 15:15:56
  16. Java平台调用Python平台已有算法(附源码及解析)

    1. 问题描述 Java平台要调用Pyhon平台已有的算法,为了减少耦合度,采用Pyhon平台提供Restful 接口,Java平台负责来调用,采用Http+Json格式交互。 2. 解决方案 2.1 JAVA平台侧 2.1.1 项目代码public static String invokeAlgorithm(String url, HashMap params) throws Excep…...

    2024/4/25 22:18:55
  17. C++ socket网络编程——即时通信系统

    一:项目内容本项目使用C++实现一个具备服务器端和客户端即时通信且具有私聊功能的聊天室。目的是学习C++网络开发的基本概念,同时也可以熟悉下Linux下的C++程序编译和简单MakeFile编写二:需求分析这个聊天室主要有两个程序:1.服务端:能够接受新的客户连接,并将每个客户端…...

    2024/4/17 5:55:04
  18. 张瀚荣 如何用UE4制作3D动作游戏

    GameLook报道/ 6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次活动由Epic Games与GameLook联合主办。 动作游戏凭借爽快的打击感和强烈的操作感一直受到玩家的喜爱,但一些高品质的3D动作游戏设计其实颇有难度,国内市场上常见的大多是横版2D游戏。…...

    2024/4/18 13:06:42
  19. 「Kubernetes」第三章,集群安装

    「Kubernetes」第三章,集群安装 Router:软路由,实现访问外网。这里不做。 Harbor:仓库,让k8s访问内部镜像。这里不做。 Master:135.251.206.137 3.10.0-1127 24cpu 128g内存 Node1:135.251.206.138 3.10.0-1127 1cpu 1g内存 Node2:135.251.206.136 3.10.0-1127 2cpu 8g…...

    2024/4/17 5:54:58
  20. SOCKET网络编程 (通俗易懂入门篇)

    温故而知新☺ 文章目录①预备知识- IP地址转换函数- sockaddr 数据结构②网络套接字函数- socket函数- bind 函数- listen函数- accept函数- connect函数- 补充5:CS模型 - TCP- Server- Client写在最后 ①预备知识在TCP/IP协议中,“IP地址+端口号”唯一标识网络通讯中的一个进…...

    2024/4/18 14:04:21

最新文章

  1. Linux 麒麟系统安装

    国产麒麟系统官网地址&#xff1a; https://www.openkylin.top/downloads/ 下载该镜像后&#xff0c;使用VMware部署一个虚拟机&#xff1a; 完成虚拟机创建。点击&#xff1a;“开启此虚拟机” 选择“试用试用开放麒麟而不安装&#xff08;T&#xff09;”&#xff0c;进入op…...

    2024/5/4 9:24:12
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 2024年04月IDE流行度最新排名

    点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...

    2024/5/1 13:25:45
  4. HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService

    HIS系统是什么&#xff1f;一套前后端分离云HIS系统源码 接口技术RESTful API WebSocket WebService 医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等&…...

    2024/5/1 13:22:01
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57