设计模式的概念

设计模式是经过高度抽象化的在编程中可以被反复使用的代码设计经验的总结。

正确使用设计模式能提高代码的可读性、可重用性和可靠性,编写符合设计模式规范的代码不但有利于自身系统的稳定、可靠,还有利于外部系统的对接。在使用了良好设计模式的系统工程中,无论是对满足当前的需求还是对适应未来的需求,无论是对自身系统间模块的对接还是对外部系统的对接,都有很大帮助。

设计模式的七个原则

  • 单一职责原则
    单一职责原则又称单一功能原则,它规定一个类只有一个职责。如果有多个职责(功能)设计在一个类中,这个类就违反了单一职责原则。

  • 开闭原则
    开闭原则规定软件中的对象(类、模块、函数等)对扩展开放,对修改封闭,这意味着一个实体允许在不改变其源代码的前提下改变其行为,该特性在产品化的环境下是特别有价值的,在这种环境下,改变源代码需要经过代码审查,单元测试等过程以确保产品的使用质量。遵循这个原则的代码在扩展时并不发生改变,因此不需要经历上述过程。

  • 里氏代换原则
    里氏代换原则是对开闭原则的补充,规定了在任意父类可以出现的地方,子类都一定可以出现。实现开闭原则的关键就是抽象化,父类与子类的继承关系就是抽象化的具体表现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

  • 依赖倒转原则
    依赖倒转原则指程序要依赖于抽象(Java中的抽象类和接口),而不依赖于具体的实现(Java中的实现类)。简单地说,就是要求对抽象进行编程,不要求对实现进行编程,这就降低了用户与实现模块之间的耦合度。

  • 接口隔离原则
    接口隔离原则是指通过将不同的功能定义在不同的接口中来实现接口的隔离,这样就避免了其他类在依赖该接口(接口上定义的功能)时依赖其不需要的接口,可减少接口之间依赖的冗余性和复杂性。

  • 合成/聚合复用原则
    合成/聚合复用原则指通过在一个新的对象中引入(注入)已有的对象以达到类的功能复用和扩展的目的。它的设计原则是要尽量使用合成或聚合而不要使用继承来扩展类的功能。

  • 迪米特法则
    迪米特法则指一个对象尽可能少地与其他对象发生相互作用,即一个对象对其他对象应该有尽可能少的了解或依赖。其核心思想在于降低模块之间的耦合度,提高模块的内聚性。迪米特法则规定每个模块对其它模块都要有尽可能少的了解和依赖,因此很容易使系统模块之间的功能独立,这使得各个模块的独立运行变得更加简单,同时使得各个模块之间的组合变得更加容易。

设计模式的分类

设计模式按照其功能和使用场景可分为三大类:

序号 设计模式 说明 包含的设计模式
1 创建型模式 提供了多种优雅创建对象的方法 工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式
2 结构型模式 通过类和接口之间的继承和引用实现创建复杂结构对象的功能 适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式
3 行为型模式 通过类之间不同的通信方式实现不同的行为方式 责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式

工厂模式 Factory Pattern

工厂模式是最常见的设计模式,该模式属于创建型模式,它提供了一种简单、快速、高效而安全地创建对象的方式。工厂模式在接口中定义了创建对象的方法,而将具体的创建对象的过程在子类中实现,用户只需通过接口创建需要的对象即可,不用关注对象的具体创建过程。同时,不同的子类可根据需求灵活实现创建对象的不同方法。

通俗地讲,工厂模式的本质就是用工厂方法代替new操作创建一种实例化对象的方式,以便提供一种方便地创建有同种类型接口地产品的复杂对象。

以创建老婆为例,假设老婆的类型有36D和75B两种类型,我们要实现的是根据不同的传入参数实例化不同的老婆,具体实现如下:
(1)定义接口

//定义了一个Wife接口,并在接口中定义了cup(),用来返回老婆的cup
public interface Wife {String cup();
}

(2)定义实现类

//定义了两个Wife的实现类BigWife和SmallWife来表示两个cup的老婆,两个cup的老婆通过实现cup()打印自己的cuppublic class BigWife implements Wife {@Overridepublic String cup() {return "this is a 36D wife";}
}public class SmallWife implements Wife {@Overridepublic String cup() {return "this is a 75B wife";}
}

(3)定义工厂类

/**定义了名为Factory的工厂类,工厂类有一个方法createWife(),用来根据不同的参数实例化不同cup的老婆类并返回在createWife的参数为"bigWife"时,工厂类为我们实例化一个BigWife类的实例并返回在createWife的参数为"smallWife"时,工厂类为我们实例化一个SmallWife类的实例并返回 这样便实现了工厂类通过不同的参数创建不同的实例,对调用者来说屏蔽了实例化的细节
*/
public class Factory {public Wife createWife(String wifeName){if("bigWife".equals(wifeName))return new BigWife();else if("smallWife".equals(wifeName))return new SmallWife();else return null;}
}

(4)使用工厂模式:

//定义了一个Factory实例,并调用createWife()根据不同的参数创建了cup为75B的实例和cup为36D的实例,并分别调用cup()打印不同的cup信息
public static void main(String[] args) {Factory factory=new Factory();Wife smallWife = factory.createWife("smallWife");Wife bigWife = factory.createWife("bigWife");System.out.println(smallWife.cup());System.out.println(bigWife.cup());}

(5)运行结果如下:
在这里插入图片描述


抽象工厂模式 Abstract Factory Pattern

抽象工厂模式在工厂模式上添加了一个创建不同工厂的抽象接口(抽象类或接口实现),该接口可叫做超级工厂。在使用过程中,我们首先通过抽象接口创建出不同的工厂对象,然后根据不同的工厂对象创建不同的对象。

我们可以将工厂模式理解为针对一个产品维度进行分类,比如上述工厂模式下的SmallWife和BigWife,而抽象工厂针对的是多个产品维度分类,比如苹果公司既制造苹果手机也制造ipad,同样华为公司也制造华为手机和华为的平板电脑。

在同一个厂商有多个维度的产品时,如果使用工厂模式,则势必会存在多个独立的工厂,这样的话设计和物理世界是不对应的。正确的做法是通过抽象工厂模式来实现,我们可以将抽象工厂类比成厂商,将通过抽象工厂创建出来的工厂类比成不同产品的生产线,在需要生产产品时根据抽象工厂生产。

以两个工厂都要创建手机和电脑为例:
(1)第一类产品的手机接口及实现类:

public interface Phone {String call();
}public class ApplePhone implements Phone {@Overridepublic String call() {return "这是苹果手机";}
}public class HuaweiPhone implements Phone {@Overridepublic String call() {return "这是华为手机";}
}

(2)第一类产品的手机工厂类定义如下:

public class PhoneFactory extends AbstractFactory {@Overridepublic Phone createPhone(String brand) {if("Huawei".equals(brand))return new HuaweiPhone();else if("Apple".equals(brand))return new ApplePhone();return null;}@Overridepublic Computer createComputer(String brand) {return null;}
}

(3)第二类产品的电脑接口及实现类的定义如下:

public interface Computer {String internet();
}public class AppleComputer implements Computer {@Overridepublic String internet() {return "使用苹果电脑上网";}
}public class HuaweiComputer implements Computer {@Overridepublic String internet() {return "使用华为电脑上网";}
}

(4)第二类产品的电脑工厂类定义如下:

public class ComputerFactory extends AbstractFactory {@Overridepublic Phone createPhone(String brand) {return null;}@Overridepublic Computer createComputer(String brand) {if("Huawei".equals(brand))return new HuaweiComputer();else if("Apple".equals(brand))return new AppleComputer();return null;}
}

(5)抽象工厂定义如下:
这个类是抽象工厂的核心类,它定义了两个方法,用户在需要手机时调用createPhone()构造一个手机即可,用户在需要电脑时调用其createComputer()构造一个电脑即可。

public abstract class AbstractFactory {public abstract Phone createPhone(String brand);public abstract Computer createComputer(String brand);
}

(6)使用抽象工厂

 public static void main(String[] args) {AbstractFactory phoneFactory=new PhoneFactory();Phone huaweiphone = phoneFactory.createPhone("Huawei");Phone applephone = phoneFactory.createPhone("Apple");System.out.println(huaweiphone.call());System.out.println(applephone.call());System.out.println("------------------------");AbstractFactory computerFactory=new ComputerFactory();Computer huaweicomputer = computerFactory.createComputer("Huawei");Computer applecomputer = computerFactory.createComputer("Apple");System.out.println(huaweicomputer.internet());System.out.println(applecomputer.internet());}

以上代码使用我们定义好的抽象工厂,在需要生产产品时,首先需要定义一个抽象工厂的工厂类,然后使用抽象的工厂类生产不同的工厂类,最终根据不同的工厂生产不同的产品。运行结果如下:
在这里插入图片描述


单例模式 Singleton Pattern

单例模式是保证系统实力唯一性的重要手段。单例模式首先通过将类的实例化方法私有化来防止程序通过其他方式创建该类的实例,然后通过提供一个全局唯一获取该类实例的方法帮助用户获取类的实例,用户只需也只能通过调用该方法获取类的实例。

单例模式的设计保证了一个类在整个系统中同一时刻只有一个实例存在,主要被用于一个全局类的对象在多个地方被使用并且对象的状态是全局变化的场景下。同时单例模式为系统资源的优化提供了很好的思路,频繁创建或销毁对象都会增加系统的资源消耗,而单例模式保障了整个系统只有一个对象能被使用,很好地节约了资源。

单例模式的实现很简单,每次在获取对象前都判断系统是否已经有这个单例对象,有则返回,无则创建。需要注意的是,单例模型的类构造器是私有的,只能由自身创建和销毁对象,不允许除了该类的其他程序使用new关键字创建对象及破坏单例模式。

懒汉模式(线程安全)

懒汉模式很简单,定义一个私有的静态对象,之所以定位为静态是因为静态属性是属于类的,能够很好地保障单例对象的唯一性,然后定义一个加锁的静态方法获取该对象,如果该对象为null,则定义一个对象实例并将其赋值给instance,这样下次获取时就有值了。

public class LazySingleton {//私有属性存放实例对象private LazySingleton instance;//私有构造器private LazySingleton(){}//获取实例的方法public synchronized LazySingleton getLazySingleton(){if(instance!=null)return instance;instance=new LazySingleton();return instance;}
}

饿汉模式

饿汉模式指在类中直接定义全局的静态对象的实例并初始化,然后提供一个方法获取该实例对象。懒汉模式和饿汉模式最大的不同在于,懒汉模式在类中定义了单例但是并未实例化,实例化的过程是在获取单例对象的方法中定义的,也就是说在第一次调用懒汉模式时,该对象一定为空,然后实例化对象并赋值。而饿汉模式是在定义单例对象时就将其实例化,也就是说在饿汉模式下,在类加载完成后该类的实例已经存在于JVM中了。

public class HungrySingleton {//私有属性存放实例对象private HungrySingleton instance=new HungrySingleton();//私有构造器private HungrySingleton(){}//获取实例的方法public synchronized HungrySingleton getHungrySingleton(){return instance;}
}

静态内部类

静态内部类通过在类中定义一个静态内部类,将对象实例的定义和初始化放在内部类中完成,我们在获取对象时要通过静态内部类调用其单例对象。之所以这样设计,是因为类的静态内部类在JVM中是唯一的,这很好地保障了单例对象的唯一性。

public class Singleton {private static class SingletonHolder{private static final Singleton INSTANCE=new Singleton();}private Singleton(){}public static Singleton getInstance(){return SingletonHolder.INSTANCE;}
}

双重校验锁

双锁模式指在懒汉模式的基础上做进一步优化,给静态对象的定义加上volatile锁来保障初始化时对象的唯一性,在获取对象时通过synchronized(Lock2Singleton.class)给单例类加索来保障操作的唯一性。

public class Lock2Singleton {private volatile static Lock2Singleton singleton;private Lock2Singleton(){}public static Lock2Singleton getSingleton(){if(singleton==null){synchronized (Lock2Singleton.class){if(singleton==null){singleton=new Lock2Singleton();return singleton;}}}return singleton;}
}

建造者模式 Builder Pattern

建造者模式使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个Builder类(该Builder类是独立于其他对象的)创建最终的对象。

建造者模式主要用于解决软件系统中复杂对象的创建问题,比如有些复杂对象的创建需要通过各部分的子对象用一定的算法构成,在需求变化时这些复杂对象将面临很大的改变,不利于系统稳定。但是使用建造者模式能将它们各部分的算法包装起来,在需求变化后只需调整各个算法的组合方式和顺序,能极大提供系统稳定性。建造者模式常被用于一些基本部件不会变而其组合经常变化的应用场景下。

建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序,而工厂模式关注产品的生产本身。

建造者模式在设计时有以下几种角色:

  • Builder 创建一个复杂产品对象的抽象接口
  • ConcreteBuilder Builder接口的实现类,用于定义复杂产品各个部件的装配流程
  • Director 构造一个使用Builder接口的对象
  • Product 表示被构造的复杂对象,ConcreteBuilder定义了该复杂对象的装配流程,而Product定义了该复杂对象的结构和内部表示

以生产一个电脑为例,电脑的生产包括cpu、memory、disk等生产过程,这些生产过程对顺序不敏感,这里的Product角色就是电脑。我们还需要定义生产电脑的Builder,ConcreteBuilder和Director ,具体实现如下:
(1)定义需要生产的产品Computer

public class Computer {private String cpu;private String memory;private String disk;public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getDisk() {return disk;}public void setDisk(String disk) {this.disk = disk;}
}

(2)定义抽象接口ComputerBuilder来描述产品构造和装配的过程

public interface ComputerBuilder {void buildCpu();void buildMemory();void buildDisk();Computer buildComputer();
}

以上代码定义了ComputerBuilder接口来描述电脑的组装过程,具体包括组装Cpu的方法buildCpu()、组装内存的方法 buildMemory()和组织磁盘buildDisk()的方法,等这些都生产和组装都完成后,就可以调用buildComputer()组装一台完整的电脑了。

(3)定义ComputerBuilder接口的实现类ComputerConcreteBuilder以实现构造和装配该产品的各个组件:

public class ComputerConcreteBuilder implements ComputerBuilder {private Computer computer;public ComputerConcreteBuilder(){computer=new Computer();}@Overridepublic void buildCpu() {System.out.println("build cpu");computer.setCpu("8core");}@Overridepublic void buildMemory() {System.out.println("build memory");computer.setMemory("16g");}@Overridepublic void buildDisk() {System.out.println("build disk");computer.setDisk("1tb");}@Overridepublic Computer buildComputer() {return computer;}
}

(4)定义ComputerDirector使用Builder接口实现产品的装配

public class ComputerDirector {public Computer constructComputer(ComputerBuilder computerBuilder){computerBuilder.buildCpu();computerBuilder.buildMemory();computerBuilder.buildDisk();return computerBuilder.buildComputer();}
}

以上代码定义了ComputerDirector来调用ComputerBuilder接口实现电脑的组装,具体组装顺序为buildCpu(),buildMemory(),buildDisk(),buildComputer()。该类是建造者模式对产品生产过程的封装,在需求发生变化且需要先装配完磁盘再装配CPU时,只需调整Director的执行顺序即可,每个组件的装配都稳定不变。

(5)构建Computer

public static void main(String[] args) {ComputerDirector computerDirector=new ComputerDirector();ComputerBuilder computerBuilder=new ComputerConcreteBuilder();Computer computer = computerDirector.constructComputer(computerBuilder);System.out.println(computer.getCpu());System.out.println(computer.getMemory());System.out.println(computer.getDisk());}

以上代码首先定义了一个ComputerDirector和ComputerBuilder,为构建Computer做好准备,然后通过调用ComputerDirector的constructComputer()实现产品Computer的构建,运行结果如下:
在这里插入图片描述


原型模式 Prototype Pattern

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。

原型模式属于创建型设计模式,它以当前对象为原型来创建另一个新的对象,而无需知道创建的细节。原型模式在Java中通常使用Clone技术实现,在JavaScript中通常使用对象的原型属性实现。原型模式的Java实现很简单,只需要原型类实现Cloneable接口并重写clone方法即可。

Java中的复制分为浅复制和深复制,浅复制:Java中的浅复制是通过实现Cloneable接口并重写clone方法实现。在浅复制的过程中,对象的基本数据类型的变量值会重新被复制和创建,而引用数据类型仍指向原对象的引用,也就是说浅复制不复制对象的引用数据类型;深复制:在深复制的过程中,不论是基本数据类型还是引用数据类型,都会被重新复制和创建。简而言之,深复制彻底复制了对象的数据,浅复制的复制不彻底(忽略了引用数据类型)。

(1)浅复制

public class Computer implements Cloneable {private String cpu;private String memory;private String disk;public Computer(String cpu, String memory, String disk) {this.cpu = cpu;this.memory = memory;this.disk = disk;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", disk='" + disk + '\'' +'}';}@Overridepublic Object clone(){try {return (Computer) super.clone();}catch (Exception e){e.printStackTrace();return null;}}
}

(2)深复制

public class ComputerDetail implements Cloneable {private String cpu;private String memory;private Disk disk;public ComputerDetail(String cpu, String memory, Disk disk) {this.cpu = cpu;this.memory = memory;this.disk = disk;}@Overridepublic String toString() {return "ComputerDetail{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", disk=" + disk +'}';}@Overridepublic Object clone(){try {ComputerDetail computerDetail= (ComputerDetail) super.clone();computerDetail.disk= (Disk) this.disk.clone();return computerDetail;}catch (Exception e){e.printStackTrace();return null;}}
}class Disk implements Cloneable{private String ssd;private String hhd;public Disk(String ssd, String hhd) {this.ssd = ssd;this.hhd = hhd;}@Overridepublic String toString() {return "Disk{" +"ssd='" + ssd + '\'' +", hhd='" + hhd + '\'' +'}';}@Overridepublic Object clone(){try{return super.clone();}catch (Exception e){e.printStackTrace();return null;}}
}

以上代码定义了ComputerDeatil和Disk两个类,其中ComputerDeatil的disk属性是一个引用对象,要实现这种对象的复制,就要使用深复制技术,具体操作是引用对象类需要实现Cloneable接口并重写clone()方法,然后再复杂对象中声明式地将引用对象复制出来赋值给引用对象地属性,具体代码:computerDetail.disk= (Disk) this.disk.clone();

(3)使用原型模型:

public static void main(String[] args) {Computer computer=new Computer("8core","16GB","1TB");System.out.println("浅复制前:"+computer);Computer computer1 = (Computer) computer.clone();System.out.println("浅复制后: "+computer1);System.out.println("--------------------");Disk disk=new Disk("208G","2Tb");ComputerDetail computerDetail=new ComputerDetail("12core","64G",disk);System.out.println("深复制前: "+computerDetail);ComputerDetail computerDetail1 = (ComputerDetail) computerDetail.clone();System.out.println("深复制后: "+computerDetail1);}

运行结果如下:
在这里插入图片描述


适配器模式 Adapter Pattern

我们常在开发中遇到各个系统的对接问题,然而每个系统的数据模型或多或少存在差异,因此可能存在修改现有对象模型的情况,这将影响系统稳定。若想在不修改原有代码结构(类的结构)的情况下完成友好对接,就需要用到适配器模式。

适配器模式通过定义一个适配器类作为两个不兼容的接口之间的桥梁,将一个类的接口转换成用户期望的另一个接口,使得两个或多个原本不兼容的接口可以基于适配器类一起工作。

适配器模式主要通过适配器类实现各个接口之间的兼容,该类通过依赖注入或者继承实现各个接口的功能并对外统一提供服务。在适配器模式的实现中有三种角色:source、targetable、adapter。sourc是待适配的类,targetable是目标接口,adapter是适配器。我们在具体应用中通过adapter将source的功能扩展到targetable,以实现接口的兼容。适配器的实现主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。

类适配器模式

在需要不改变原有接口或类结构的情况下扩展类的功能以适配不同的接口时,可以使用类的适配器模式。适配器模式通过创建一个继承原有类(需要扩展的类)并实现新接口的适配器类来实现。
(1)定义Source类
待适配的Source类,在该类实现了一个编辑文件的方法editText()

public class Source {public void editText(){System.out.println("编辑text文件");}
}

(2)定义Targetable接口
定义了一个Targetable接口,在该接口定义了两个方法,其中editText是Source中待适配的方法

public interface Targetable {void editText();void editWord();
}

(3)定义Adapter继承Source类并实现Targetable接口
适配后的类既可以编辑文本文件,也可以编辑word文件

public class Adapter extends Source implements Targetable{@Overridepublic void editWord() {System.out.println("编辑word文件");}
}

(4)使用类的适配器

public static void main(String[] args) {Targetable targetable=new Adapter();targetable.editText();targetable.editWord();}

在使用适配器时只需定义一个实现了Targetable接口的Adapter类并调用target中适配好的方法即可。从运行结果看出适配器不但实现了编辑文本文件的功能,还实现了编辑word文件的功能:
在这里插入图片描述


对象适配器模式

对象适配器模式的思路和类适配器模式基本相同,只是修改了Adapter类。Adapter不再继承Source类,而是持有Source类的实例以解决兼容性问题。
(1)适配器类的定义如下:
定义一个适配器类,该适配器实现了Targetable接口并持有Source实例,在适配editText()方法时调用Source实例提供的方法即可。

public class ObjectAdapter implements Targetable {private Source source;public ObjectAdapter(Source source){this.source=source;}@Overridepublic void editText() {this.source.editText();    }@Overridepublic void editWord() {System.out.println("编辑word文件");}
}

(2)使用对象适配器模式:

public static void main(String[] args) {Source source=new Source();Targetable targetable=new ObjectAdapter(source);targetable.editText();targetable.editWord();}

在使用对象适配器时首先需要定义一个Source实例,初始化时将Source实例作为构造器的参数传递进去,这样就解决了对象的适配,执行结果如下:
在这里插入图片描述


接口适配器模式

在不希望实现一个接口中的所有方法时,可以创建一个抽象类AbstractAdapter实现所有方法,在使用时继承该抽象类按需实现方法即可。

(1)定义公共接口Sourceable

public interface Sourceable {void editText();void editWord();
}

(2)定义抽象类AbstarctAdapter并实现公共接口的方法

public class AbstarctAdapter implements Sourceable {@Overridepublic void editText() {}@Overridepublic void editWord() {}
}

(3)定义SourceSub1按照需求实现editText()

public class SourceSub1 extends AbstarctAdapter {@Overridepublic void editText() {System.out.println("编辑text文件");}
}

(4)定义SourceSub2按照需求实现editWord()

public class SourceSub2 extends AbstarctAdapter {@Overridepublic void editWord() {System.out.println("编辑word文件");}
}

(5)使用接口适配器

public static void main(String[] args) {Sourceable source1=new SourceSub1();Sourceable source2=new SourceSub2();source1.editText();source2.editWord();}

使用接口适配器时按照需求实例化不同的子类并调用实现好的方法即可,运行结果:
在这里插入图片描述


装饰者模式 Decorator Pattern

装饰者模式指在无需改变原有类及类的继承关系的情况下,动态扩展一个类的功能。它通过装饰者来包裹真实的对象,并动态地向对象添加或者撤销功能。

装饰者模式包括Source和Decorator两种角色,source是被装饰者,decorator是装饰者。装饰者模式通过装饰者可以为被装饰者Source动态地添加一些功能。
(1)定义Sourceable接口
定义了一个Sourceable接口,该接口定义了一个生产老婆地方法。

public interface Sourceable {public void createWife();
}

(2)定义Sourceable接口的实现类Source

public class Source implements Sourceable {@Overridepublic void createWife() {System.out.println("create wife by Source");}
}

(3)定义装饰者类Decorator

public class Decorartor implements Sourceable {private Sourceable source;public Decorartor(Sourceable source){this.source=source;}@Overridepublic void createWife() {source.createWife();System.out.println("your wife becomes 36D");}
}

(4)使用装饰者模式

public static void main(String[] args) {Sourceable source=new Source();Decorartor decorartor = new Decorartor(source);decorartor.createWife();}

在使用装饰者模式时,需要先定义一个待装饰的Source类的实例对象,然后初始化构造器Decorartor并在构造器传入该实例对象,最后调用createWife(),运行结果如下:
在这里插入图片描述


代理模式 Proxy Pattern

代理模式指为对象提供一种通过代理的方式来访问并控制该对象行为的方法。在客户端不适合或者不能够直接引用一个对象时,可以通过该对象的代理对象实现对该对象的访问,可以将该代理对象理解为客户端和目标对象之间的中介者。

在代理模式下有两种角色,一种是被代理者,一种是代理(Proxy),在被代理者需要做一项工作时,不用自己做而是交给代理做。以企业招聘为例,不用自己去市场找,可以通过代理去找。
(1)定义Company接口及其实现类Hr:

public interface Company {void findWorker(String title);
}public class Hr implements Company {@Overridepublic void findWorker(String title) {System.out.println("我需要找招聘一个员工,岗位是:"+title);}
}

(2)定义代理类

public class Proxy implements Company {private Hr hr;public Proxy(){this.hr=new Hr();}@Overridepublic void findWorker(String title) {hr.findWorker(title);System.out.println("找到了员工:"+getWorker(title));}private String getWorker(String title){Map<String,String> workerList=new HashMap<String,String>(){{put("Java","james");put("Python","kobe");}};return workerList.get(title);}
}

(3)使用代理模式

 public static void main(String[] args) {Company company=new Proxy();company.findWorker("Java");}

在使用代理模式时直接定义一个代理对象并调用其代理的方法即可,运行结果如下:
在这里插入图片描述


外观模式 Facade Pattern

外观模式也叫做门面模式,通过一个门面向客户端提供一个访问系统的统一接口,客户端无需关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要目的是降低访问拥有多个子系统的复杂系统的难度,简化客户端与其之间的接口。外观模式将子系统中的功能抽象成一个统一的接口,客户端通过这个接口访问系统,使得系统使用起来更加容易。

简单来说外观模式就是将多个子系统及其之间的复杂关系和调用流程封装到一个统一的接口或类中以对外提供服务,这种模式设计三种角色:子系统角色:实现了子系统的功能;门面角色:外观模式的核心, 熟悉各子系统的功能和调用关系并根据客户端的需求封装统一的方法来对外提供服务;客户角色:通过调用门面来完成业务功能。

以找老婆为例,你只想找一个好看的,学历好的老婆,并不会关注她是不是人工的,毕业证是怎么拿的。
(1)定义整容类

public class MakeFace {public void start(){System.out.println("your wife is ugly");}public void end(){System.out.println("your wife is beautiful now!");}
}

(2)定义学习类

public class MakeStudy {public void start(){System.out.println("your wife is fool");}public void end(){System.out.println("your wife is clever now!");}
}

(3)定义门面类

public class MakeWife {private MakeFace makeFace;private MakeStudy makeStudy;public MakeWife() {this.makeFace = new MakeFace();this.makeStudy = new MakeStudy();}public void start(){makeFace.start();makeStudy.start();}public void end(){makeFace.end();makeStudy.end();}
}

(4)使用外观模式

public static void main(String[] args) {MakeWife makeWife = new MakeWife();makeWife.start();makeWife.end();}

在使用外观模式时,用户只需定义门面类的实例并调用封装好的方法或接口即可,运行结果如下:
在这里插入图片描述


桥接模式 Bridge Pattern

桥接模式通过将抽象及其实现解耦,使二者可以根据需求独立变化。这种类型的设计模式属于结构型模式,通过定义一个抽象和实现之间的桥接者来达到解耦的目的。

桥接模型主要用于解决在需求多变的情况下使用继承造成类爆炸的问题,扩展起来不够灵活。可以通过桥接模式将抽象部分与实现部分分离,使其能够独立变化而相互之间的功能不受影响。具体的做法是通过定义一个桥接接口,使得实体类的功能独立于接口实现类,降低他们之间的耦合度。

JDBC和DriverManager就使用了桥接模式,JDBC在连接数据库时,在各个数据库之间切换而不需要修改代码,因为JDBC提供了统一的接口,每个数据库都提供了各自的实现,通过一个叫做数据库驱动的程序来桥接即可。下面以数据库连接为例介绍桥接模式。
(1)定义Driver接口

public interface Driver {void executeSql();
}

(2)定义MySQL的实现类

public class MysqlDriver implements Driver {@Overridepublic void executeSql() {System.out.println("使用mysql执行sql");}
}

(3)定义Oracle的实现类

public class OracleDriver implements Driver {@Overridepublic void executeSql() {System.out.println("使用oracle执行sql");}
}

(4)定义DriverMangerBridge:

public abstract class DriverMangerBridge {private Driver driver;public void execute(){driver.executeSql();}public Driver getDriver(){return driver;}public void setDriver(Driver driver) {this.driver = driver;}
}

(5)定义MyDriverBridge

public class MyDriverBridge extends DriverMangerBridge {@Overridepublic void execute() {getDriver().executeSql();}
}

(6)使用桥接模式

 public static void main(String[] args) {DriverMangerBridge driverMangerBridge = new MyDriverBridge();driverMangerBridge.setDriver(new MysqlDriver());driverMangerBridge.execute();driverMangerBridge.setDriver(new OracleDriver());driverMangerBridge.execute();}

在以上代码使用了桥接模式,定义了一个DriverMangerBridge,注入不同的驱动器,实现不同的功能,执行结果如下:
在这里插入图片描述


组合模式 Composite Pattern

组合模式又叫做部分整体模式,主要用于实现部分和整体操作的一致性。组合模式常根据树形结构来表示部分及整体之间的关系,使得用户对单个对象和组合对象的操作具有一致性。

组合模式通过特定的数据结构简化了部分和整体之间的关系,使得客户端可以像处理单个元素一样来处理整体的数据集,而无需关心单个元素和整体数据集之间的内部复杂结构。

组合模式以类似树形结构的方式实现整体和部分之间关系的组合,下面以实现一个简单的树为例介绍组合模式。
(1)定义TreeNode

public class TreeNode {private String name;private TreeNode parent;private Vector<TreeNode> children=new Vector<>();public TreeNode(String name){this.name=name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public TreeNode getParent() {return parent;}public void setParent(TreeNode parent) {this.parent = parent;}public void add(TreeNode node){children.add(node);}public void remove(TreeNode node){children.remove(node);}public Enumeration<TreeNode> getChildren(){return children.elements();}@Overridepublic String toString() {return "TreeNode{" +"name='" + name + '\'' +", parent=" + parent +", children=" + children +'}';}
}

以上代码定义了TreeNode类表示一个树形结构,并定义了children来存储子类,定义了方法add()和remove()来向树中添加和删除数据。
(2)使用TreeNode

public static void main(String[] args) {TreeNode nodeA=new TreeNode("A");TreeNode nodeB=new TreeNode("B");nodeA.add(nodeB);System.out.println(nodeA);}

以上代码演示了TreeNode的使用过程,定义了nodeA和nodeB,并将nodeB作为nodeA的子类,运行结果如下:
在这里插入图片描述


享元模式 Flyweight Pattern

享元模式主要通过对象的复用减少对象创建的次数和数量,减少系统内存的使用和降低系统负载。享元模式属于结构型模型,在系统需要一个对象时享元模式首先在系统中查找并尝试重用现有的对象,如果未找到匹配对象则创建新对象并将其缓存在系统中。

享元模式主要用于避免在有大量对象时频繁创建和销毁对象造成系统资源的浪费,把其中共同的部分抽象出来,如果有相同的业务请求则直接返回内存中已有的对象。

下面以内存的申请和使用为例介绍享元模式的使用,创建一个MemoryFactory作为内存管理的工厂,用户通过工厂获得内存,在系统内存池有可用内存时直接获取,如果没有则创建一个内存对象并放入内存池,等下次有相同的内存请求时直接将该内存分配给用户即可。
(1)定义Memory

public class Memory {private int size;private boolean isUsed;private String id;public Memory(int size, boolean isUsed, String id) {this.size = size;this.isUsed = isUsed;this.id = id;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public boolean isUsed() {return isUsed;}public void setUsed(boolean used) {isUsed = used;}public String getId() {return id;}public void setId(String id) {this.id = id;}
}

(2)定义MemoryFactory工厂

public class MemoryFactory {private static List<Memory> memoryList=new ArrayList<>();public static Memory getMemory(int size){Memory memory=null;for(int i=0;i<memoryList.size();i++){memory=memoryList.get(i);if(memory.getSize()==size&& !memory.isUsed()){memory.setUsed(true);memoryList.set(i,memory);System.out.println("直接获取内存");break;}}if(memory==null){memory=new Memory(32,false, UUID.randomUUID().toString());memoryList.add(memory);System.out.println("创建新内存");}return memory;}public static void releaseMemory(String id){for(int i=0;i<memoryList.size();i++){Memory memory = memoryList.get(i);if(memory.getId().equals(id)){memory.setUsed(false);memoryList.set(i,memory);System.out.println("释放内存");break;}}}
}

以上代码定义了工厂类MemoryFactory,在该类中定义了memoryList用于存储从系统中申请到的内存,该类定义了getMemory,用于从memoryList中获取内存,如果在内存中有空闲的内存直接取出返回,并将该内存的使用状态设置为已使用,如果没有则创建内存并放入内存列表。还定义了释放内存的方法,具体是将内存的使用状态设为false。
(3)使用享元模式

public static void main(String[] args) {Memory memory=MemoryFactory.getMemory(32);MemoryFactory.releaseMemory(memory.getId());MemoryFactory.getMemory(32);}

运行结果如下:
在这里插入图片描述


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

相关文章

  1. Eclipse ADT 中自动提示的方法参数都是arg0, arg1的解决方法

    不管做android还是java,有时候用Eclipse中Alt+/提示出来重写的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便。这时候按住Ctrl键点击arg0前面的类名也跟踪不到源码,就是因为使用的jar包中没有源码导致的。解决办法就是attachsource即可。以android为…...

    2024/4/28 0:27:37
  2. Eclipse卸载旧版本ADT

    如果安装了旧版本的ADT,在安装新版本ADT时可能会出现问题,这时需要卸载旧版本的ADT,卸载步骤如下: 1、选择Help->About->Installation Details,2、选择相应的项目,然后点击Uninstall,3、在下一个窗口中,确认要删除的ADT,然后点击Finish进行删除, 4、重启Eclips…...

    2024/4/28 10:46:40
  3. [设计模式](六):装饰器模式(Decorator)和代理模式(Proxy)|委托模式(Delegater )

    代理模式和委托模式其实是一个东西,文字游戏罢了,待会儿我们再细讲,这两个模式今天统称代理模式。装饰器模式和代理模式也是结构模式(之前讲过的适配器模式也是结构模式)。 >什么是装饰器模式?装饰器模式,是指对一个类的功能进行扩展,同时保证不修改原类的代码,遵循…...

    2024/4/28 5:17:54
  4. vb上传下载控件Inet-FTP使用大全

    http://blog.sina.com.cn/s/blog_7a44d60901012m8j.html1、利用Inet控件上传文件格式:inet1.execute , "put 本地文件 远程文件"范例:初始化Inet控件Inet1.Protocol = icFTPInet1.URL = "ftp://u0501901.k1.13939.org"Inet1.RemotePort = 21Inet1.UserNa…...

    2024/4/20 21:13:21
  5. ubuntu 编译内核

    原文地址:http://blog.zhaoke.com/7.html如何编译一个内核 - Ubuntu方式 赵珂, 2006-11-17 HTML:版本: 1.0作者: Falko Timme <ft [at] falkotimme [dot] com>翻译: Ken Zhao <cn.zhaoke.com>原文: http://www.howtoforge.com/kernel_compilation_ubuntu中文:…...

    2024/4/28 8:07:30
  6. eclipse安装ADT出错问题

    在使用Eclipse(mars)安装ADT时,报如下错误: No repository found containing: osgi.bundle,com.android 一堆,就不复制过来了。 通过网上找,可以直接下载ADT zip包,然后在eclipse的install new software中直接选择这个zip包,然后一路向下就行了。 网上有些答案说跟ecli…...

    2024/4/20 7:11:57
  7. 《快乐码农》第3期 大爱Javascript

    《快乐码农》第3期 大爱Javascript 很不错的资源 了解更多就去:http://www.codeceo.com/article/category/weekly前言《快乐码农》第3期发布,本期我们的聚焦点是Javascript,包括Javascrpt排序、Javascript设计模式以及Javascript高性能编程。另外也收集了不少关于WEB编程和…...

    2024/4/20 23:50:11
  8. Android Studio教程04-导入Eclipse项目到AndroidStudio(包括导入第三方Project项目(不是jar包形式))

    1、在Welcome界面选中Import Project(Eclipse ADT, Gradle,etc)在第二个界面选中自己的Eclipse项目。点击OK之后,跳转到下一个界面》一直Next到Finish!等待AS构建项目完成之后,会有一个import-summary.txt的文件,这个文件用来告诉你导入进来的项目的一些信息以及BUG或者Erro…...

    2024/4/20 23:50:10
  9. MVC学习系列-WebForm与asp.net MVC两种设计模式区别、MVC设计模式基础了解

    ASP.NET 是一个开发框架,用于通过 HTML、CSS、JavaScript 以及服务器脚本来构建网页和网站。ASP.NET 支持三种开发模式:Web Pages、MVC (Model View Controller) 以及 WebForm。下面首先区别比较一下WebForm 和MVC两种设计模式,接着进行MVC基础知识的讲解。一、两种设计模式…...

    2024/4/20 23:50:09
  10. 学习笔记:VS2008里增加 ADO data 控件(Microsoft ADO data control 6.0)

    增加 Microsoft ADO data control 6.0 与 Microsoft DataGrid Control 控件分两种情况,一:系统已经安装;二:系统没安装。我属于第二种,找了很,终于找到答案。 情况一: 打开vs,工具箱右键-〉选择项……-〉com组件-〉选Microsoft ADO data control 6.0。 工具箱就出现…...

    2024/4/20 23:50:09
  11. 三.创建型设计模式——Simple Factory Pattern(简单工厂模式)

    定义专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常它根据变量的不同返回不同的类的实例。UML类图如下:简单工厂模式的实质是由一个工厂类…...

    2024/4/20 23:50:07
  12. 解决AndroidADT自带Eclipse编辑器不能自动代码提示的问题。

    今天发现,我下载的AndroidADT开发套装中自带的Eclipse没有自动代码提示功能。通过参考http://blog.csdn.net/coolszy/article/details/7241955文章解决了问题。总结一下,解决方法分为两步:一、设置“Auto activation triggers for java”打开:Eclipse -> Window -> P…...

    2024/4/20 23:50:06
  13. Js-JavaScript 观察者设计模式 Observer Pattern

    在函数式编程中,观察者设计模式是非常有必要的,尽管在JS里到处都充斥着观察者模式(Observer Pattern),但我们仍然有必要去了解它。以便实现自己的观察者模式,用于更复杂的应用场景。其实要实现观察者模式实在是很简单。 现在我们回顾一下我们遇到过的观察者模式,最常见…...

    2024/4/26 22:17:01
  14. C# Winform RichTextBox 控件简单扩展

    RichTextBox控件扩展 环境:Windows 10 64位 VS2017 实现了以下几个简单功能:新建 文件 打开文件(txt,rtf,doc,docx):特别说明,doc及docx的表格显示会有问题,内容太多时有乱码,暂时没有找到解决办法。 保存文件(txt,rtf,doc,docx) 打印及打印预览 复制,剪切和粘贴 字…...

    2024/4/20 23:50:04
  15. How to Install Eclipse ADT, Android SDK, and setup AVD Emulator

    Steps:1. Get Eclipse (I use Eclipse 3.7 – Indigo), download from: Eclipse.org or EclipseSource (clouddownload – a lot faster!!! ) 2. Get Android SDK,run the installation: After the installation, run the SDK ManagerCheck “Tools” and the Android version…...

    2024/4/20 23:50:03
  16. 2017补全计划-JS的工厂模式-学习笔记

    参考以下资料:【JavaScript设计模式2】-简单工厂模式深入理解JavaScript系列(28):设计模式之工厂模式前端的工厂模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况(简单说是写代码时候A B C写出来 用运行是用户来决定用那种情况)上代码:var produc…...

    2024/4/20 8:29:43
  17. 如何编译一个内核 - Ubuntu方式(转)

    版本: 1.0作者: Falko Timme <ft [at] falkotimme [dot] com>翻译: Ken Zhao <cn.zhaoke.com>原文: http://www.howtoforge.com/kernel_compilation_ubuntu中文: http://blog.zhaoke.com/7.html最后更新 11/05/2006 中文最后更新 11/17/2006每一个Linux发行版都有…...

    2024/4/20 23:50:01
  18. javascript模式--模块模式

    javascript Module(模块)模式这篇内容主要是对 “javascript设计模式” 中模块模式一节做了整理总结从javascript对象创建说起说起Module(模块)模式,可能一些刚刚接触javascript的同学还是觉得比较陌生,但是相信大多数学习javascript的同学都知道javascript对象创建的方式。最…...

    2024/4/20 23:50:00
  19. DevExpress Winform 所有可打印控件(gridcontrol等)通用导出excel方法

    关于DevExpress Winform 的所有可打印控件的导出excel 的通用方法,并且解决DevExpress控件自带的方法存在的缺陷问题 1、解决GridControl自带方法不能导出图片; 2、GridControl 的BandGridView 多表头无法导出等问题; 3、解决PivotGridControl导出时候自动分组的问题; 4、支…...

    2024/4/20 23:49:59
  20. Eclipse+ADT进行Android应用程序的代码签名

    1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包:2.选择需要打包的android项目工程(注:这里会自动选择当前的Project的):3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见 第6和7步创建私钥文件:4.输入私钥别名和密码:5.选择APK存储的…...

    2024/4/20 23:50:00

最新文章

  1. 等保测评与信息安全管理体系认证的区别

    区别一、标准以及性质 等保测评以《中华人民共和国计算机信息系统安全保护条例》为基础&#xff0c;结合一系列的政策和标准&#xff0c;对信息安全水平进行评估。而安全管理系统的认证&#xff0c;是资讯安全管理系统的一种规范&#xff0c;本身并不具备强制性质。企业可根据…...

    2024/4/28 16:07:13
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 一个浮动绝对居中的tailwindcss

    今天改进图片组件&#xff0c;遇到个SVG绝对居中的问题。想起之前大概是通过top left来实现&#xff0c;由于组件的宽高需要动态输入。不能定死宽高&#xff0c;于是想起来问GPT。刚开始老是给一些很菜的代码&#xff0c;不是我想要的 气不打一处来&#xff0c;索性给他限死框框…...

    2024/4/26 21:09:53
  4. 文心一言 vs GPT-4 —— 全面横向比较

    对于文心一言和 GPT-4 这两者之间的全面横向比较&#xff0c;我们可以从多个方面来看待它们的区别和优劣势。 文心一言 文心一言是一款基于深度学习的中文文本生成模型&#xff0c;专注于生成优美的古风诗句和语录。以下是它的一些特点&#xff1a; 专注于古风诗句和语录: 文…...

    2024/4/24 17:52:27
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/4/28 13:51:37
  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/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

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

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

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

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

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

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/27 8:32:30
  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