设计模式

在这里插入图片描述23种设计模式,一个没少。比较常用的:单例、工厂、适配器、装饰者、代理、观察者这几个模式。其他的做了解。

创建型模式

单例模式

作用:确保一个类只有一个实例,只对外提供一个访问该实例的全局访问点。
特征:
1、无法通过new得到实例,构造器是被private修饰的
2、一般通过getInstance()的方法来获取它们的实例,而getInstance方法是对象的引用,并不是真正的new一个对象
对于单例模式,又分为这几类

饿汉式单例模式
我的理解就是饿汉就是初始化就对对象加载,没有延时

public class SingletonDemo1 {//类初始化时,立即加载这个对象(没有延时加载的优势)。加载类时,天然的是线程安全的!private static SingletonDemo1 instance = new SingletonDemo1();  private SingletonDemo1(){}//方法没有同步,调用效率高!public static SingletonDemo1  getInstance(){return instance;}}

懒汉式加载(线程不安全)

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

懒汉式加载(线程安全)

public class SingletonDemo2 {//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。private static SingletonDemo2 instance;  private SingletonDemo2(){ //私有化构造器}//方法同步,调用效率低!public static  synchronized SingletonDemo2  getInstance(){if(instance==null){instance = new SingletonDemo2();}return instance;}}

双重检查锁

注意:
双重检测锁式:涉及到JVM底层内部模型,偶尔会出问题。不建议使用

public class SingletonDemo3 { private static SingletonDemo3 instance = null; public static SingletonDemo3 getInstance() { if (instance == null) { SingletonDemo3 sc; synchronized (SingletonDemo3.class) { sc = instance; if (sc == null) { synchronized (SingletonDemo3.class) { if(sc == null) { sc = new SingletonDemo3(); } } instance = sc; } } } return instance; } private SingletonDemo3() { } }

静态内部类
这个方法需要熟悉使用,很多用到单例的地方用这个方法就差不多可以了,优点:线程安全,调用效率高,并且实现了延时加载!

public class SingletonDemo4 {private static class SingletonClassInstance {private static final SingletonDemo4 instance = new SingletonDemo4();}private SingletonDemo4(){}//方法没有同步,调用效率高!public static SingletonDemo4  getInstance(){return SingletonClassInstance.instance;}}

枚举实现单例模式

这个方法也很好地避免了多线程同步的问题,并且还能够反序列化重新创建对象。

public enum SingletonDemo5 {//这个枚举元素,本身就是单例对象!INSTANCE;}

实际上,这里的单例模式并不是真正的单例,当出现反射和反序列化的时候就会变成原来的普通对象

反射测试

//懒汉测试类
public class SingletonDemo06 /*implements Serializable*/{private static SingletonDemo06 instace;private SingletonDemo06() {//需要私有化构造器}//方法需要同步,调用效率低public static synchronized SingletonDemo06 getInstace() {if(null == instace){instace = new SingletonDemo06();}return instace;}}

通过反射调用私有构造器

public static void main(String[] args) throws Exception, SecurityException {SingletonDemo06 s1 = SingletonDemo06.getInstace();SingletonDemo06 s2 = SingletonDemo06.getInstace();System.out.println(s1);System.out.println(s2);//通过反射的方式调用私有构造器Class<SingletonDemo06> clz = (Class<SingletonDemo06>) SingletonDemo06.class;Constructor<SingletonDemo06> cc = clz.getDeclaredConstructor();cc.setAccessible(true);SingletonDemo06 s3 = (SingletonDemo06)cc.newInstance();SingletonDemo06 s4 = (SingletonDemo06)cc.newInstance();System.out.println(s3);//Singleton.SingletonDemo06@2ff4acd0System.out.println(s4);//Singleton.SingletonDemo06@54bedef2
}

很显然反射后的对象跟单例的hashcode不一样
解决反射的方式
在私有构造器加一层判断

public class SingletonDemo06 /*implements Serializable*/{private static SingletonDemo06 instace;private SingletonDemo06() {//需要私有化构造器if(null != instace){throw new RuntimeException();//防止反射下创建新的对象}}//方法需要同步,调用效率低public static synchronized SingletonDemo06 getInstace() {if(null == instace){instace = new SingletonDemo06();}return instace;}}

反序列化Demo

	public static void main(String[] args) throws Exception, SecurityException {SingletonDemo06 s1 = SingletonDemo06.getInstace();SingletonDemo06 s2 = SingletonDemo06.getInstace();System.out.println(s1);//Singleton.SingletonDemo06@279f2327System.out.println(s2);//Singleton.SingletonDemo06@279f2327//通过反射的方式调用私有构造器
//		Class<SingletonDemo06> clz = (Class<SingletonDemo06>) SingletonDemo06.class;
//		Constructor<SingletonDemo06> cc = clz.getDeclaredConstructor();
//		cc.setAccessible(true);
//		SingletonDemo06 s3 = (SingletonDemo06)cc.newInstance();
//		SingletonDemo06 s4 = (SingletonDemo06)cc.newInstance();
//		System.out.println(s3);//Singleton.SingletonDemo06@2ff4acd0
//		System.out.println(s4);//Singleton.SingletonDemo06@54bedef2//通过反序列化的方式构造多个对象FileOutputStream fos = new FileOutputStream("d:/a.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(s1);oos.close();fos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));SingletonDemo06 s3 =  (SingletonDemo06) ois.readObject();System.out.println(s3);//Singleton.SingletonDemo06@26a1ab54}

解决方法readResolve()直接返回指定的单例对象

public class SingletonDemo06 implements Serializable{private static SingletonDemo06 instace;private SingletonDemo06() {//需要私有化构造器if(null != instace){throw new RuntimeException();//防止反射下创建新的对象}}//方法需要同步,调用效率低public static synchronized SingletonDemo06 getInstace() {if(null == instace){instace = new SingletonDemo06();}return instace;}//反序列化时,如果定义了readResolve()则直接返回此方法指定的对象。而不需要单独再创建新对象!private Object readResolve() throws Exception{return instace;}
}

总结:
单例模式的优点:
1、单例模式只产生一个实例,减少了性能的开销
2、当一个对象需要很多资源的时候,例如读取配置、产生依赖等,可以直接在启动时产生单例,让他永久驻留内存
3、单例可以让全局使用,达到优化资源共享

五种单例模式的实现方式比较:

  1. 饿汉式:线程安全,调用效率高。 但是,不能延时加载
  2. 懒汉式:线程安全,调用效率不高。 但是,可以延时加载
  3. 双重检测锁式:由于JVM底层内部模型原因,偶尔会出问题。不建议使用
  4. 静态内部类式:线程安全,调用效率高。 但是,可以延时加载
  5. 枚举单例:线程安全,调用效率高,不能延时加载
    效率测试

单例模式的应用:
1、Windows的Task Manager(任务管理器)、回收站就是很典型的单例模式
2、 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作 ,否则内容不好追加。
3、spring容器的管理

工厂模式

主要是为了实现创建者和调用者的分离。通过工厂的方法代替new实例化对象,将实现类、创建对象统一管理和控制,达到调用者与实现者的解耦合。

简单工厂模式
一个抽象的接口,多个抽象接口的实现类,一个工厂类。弊端:一般是静态方法,对新增加的类必须修改代码。

public intereface Car{void run();
}
public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪生产");}
}
public class byd implements Car{@Overridepublic void run() {System.out.println("比亚迪生产");}
}
//工厂类
public class CarFactory {public static Car createCar(String type) {if("奥迪".equals(type)){return new Audi();}else if ("比亚迪".equals(type)) {return new byd();}else {return null;}}
}
public static void main(String[] args) {//没有工厂创建类Car cc1 = new Audi();Car cc2 = new byd();cc1.run();cc2.run();//工厂下创建类Car c1 = CarFactory.createCar("奥迪");Car c2 = CarFactory.createCar("比亚迪");c1.run();c2.run();}

工厂方法模式
四个角色:抽象工厂模式、具体工厂模式、抽象产品、具体产品。实现抽象工厂的子类实现实例化,工厂方法弥补了简单工厂模式的缺点,区别在于:多了接口的工厂类。弊端:工厂方法模式的工厂类随着产品类个数增加而增加,从而增加了结构的复杂程度。

Demo

接口

public interface Car {void run();
}
public interface CarFactory {Car createCar();
}

实体类

public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪00000");}}
public class AudiFactory implements CarFactory {@Overridepublic Car createCar() {return new Audi();}}
public class byd implements Car {@Overridepublic void run() {System.out.println("比亚迪byd");}}
public class BydFactory implements CarFactory {@Overridepublic Car createCar() {return new Byd();}}
public class Benz implements Car {@Overridepublic void run() {System.out.println("奔驰B!");}}
public class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new Benz();}}

但是工厂模式并没有简单工厂模式用的多。

抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务 分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。区别在于:工厂模式只生产单一的产品,抽象工厂模式中的工厂生产多个产品
Demo

public interface CarFactory {Engine createEngine();Seat createSeat();Tyre createTyre();
}public interface Tyre {void revolve();
}
public interface Seat {void massage();
}
class LuxurySeat implements Seat {@Overridepublic void massage() {System.out.println("全自动!");}}
class LowSeat implements Seat {@Overridepublic void massage() {System.out.println("手动!");}}
class LuxuryTyre implements Tyre {@Overridepublic void revolve() {System.out.println("米其林轮胎!");}}class LowTyre implements Tyre {@Overridepublic void revolve() {System.out.println("普通轮胎!");}}

工厂实例

public class LowCarFactory implements CarFactory {@Overridepublic Seat createSeat() {return new LowSeat();}@Overridepublic Tyre createTyre() {return new LowTyre();}}
public class LuxuryCarFactory implements CarFactory {@Overridepublic Seat createSeat() {return new LuxurySeat();}@Overridepublic Tyre createTyre() {return new LuxuryTyre();}}

总结:
1、 简单工厂模式:用的比较多,但在程序中并不是最好的
2、工厂方法模式 :不修改已有类的前提下,通过增加新的工厂类实现扩展。
3、抽象工厂模式 :可以对产品族扩展,但是不好增加产品

构建者模式

场景:如何构建一台手机?
因为会存在生产组件还有装配两个步骤才能生产出一台手机。
构建者模式就是适用于对象构建复杂的情况。通过构建和装配的解耦合。就可以有不同的装配,做出不同的对象。相同的装配也可能因为装配顺序导致对象不同。属于业务与算法的解耦。例StringBuilder的实现。
在这里插入图片描述

原型模式
类似于克隆,以一个对象为原型,复制出一个新的队象,并且具备原型的特点。直接克隆效率高。
实现:
1、Cloneable和clone方法
克隆存在的问题就是浅拷贝跟深拷贝。有学过指针的朋友就比较熟悉了。
在这里插入图片描述浅拷贝问题:浅拷贝会导致两个对象都用同一块内存空间,导致数据公用
解决方法:深克隆,让已实现Clonable接口的类中的属性也实现Clonable接口
深克隆:让已实现Clonable接口的类中的属性也实现Clonable接口
Demo
浅拷贝

public class Sheep implements Cloneable,Serializable {   //1997,英国的克隆羊,多利!private String sname;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();  //直接调用object对象的clone()方法!return obj;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Sheep(String sname, Date birthday) {super();this.sname = sname;this.birthday = birthday;}public Sheep() {}}

深拷贝

public class Sheep2 implements Cloneable {   //1997,英国的克隆羊,多利!private String sname;private Date birthday;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();  //直接调用object对象的clone()方法!//添加如下代码实现深复制(deep Clone)Sheep2 s = (Sheep2) obj;s.birthday = (Date) this.birthday.clone();  //把属性也进行克隆!return obj;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Sheep2(String sname, Date birthday) {super();this.sname = sname;this.birthday = birthday;}public Sheep2() {}}

总结:
1、如果需要创建大量对象,new会比原型模式低效
2、单例和原型是相反的,spring中创建bean就是这两种方式

结构型模式

适配器模式

适配器模式:是为了让原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

目标接口(target):使用者用到的接口。可以是具体类/抽象类/接口 。
被适配的类(Adaaptee):需要适配的类
适配器(Adapter):将被适配的类包装成目标接口

在这里插入图片描述Demo

//需要被适配的类
public class Adaptee {public void request(){System.out.println("客户请求");}
}
//通过继承方式的适配器
public class Adapter extends Adaptee implements Target {@Overridepublic void handleReq() {// TODO 自动生成的方法存根super.request();	}}
//内部产生被适配对象
public class Adapter2 implements Target{private Adaptee adaptee;public Adapter2(Adaptee adaptee) {super();this.adaptee = adaptee;}public void handleReq(){adaptee.request();}}
//目标接口
public interface Target {void handleReq();
}

装饰者模式

动态地给一个对象增加新的功能。装饰模式是一种用于代替继承的方式,不需要再通过继承就能扩展对象的新功能。
举个例子:我想要一台智能、既上天又可以下水还能陆地跑的车。但是我现在只有一台普通的车,我就要给不同的厂家改装这台车,有智能公司、飞机公司等等。最后得到我想要的车
Component抽象:实现客户端跟实例对象的交互,如 io流中的InputStream、OutputStream接口
ConcreteComponent:真实对象,如 io流中的FileInputStream、FileOutputStream,例子中手上的普通车
Decorator装饰角色:抽象装饰接口,方便对真实对象添加功能
ConcreteDecorator具体装饰角色: 真正的装饰,给真正对象包装一层外衣。如Io流中的BufferedOutputStream、BufferedInputStream
在这里插入图片描述
Demo

public interface Icar {void move();
}
//ConcreteComponent 具体构件角色(真实对象)
class car implements Icar{@Overridepublic void move() {System.out.println("地上跑");}}
//Decorator 装饰
class SuperCar implements Icar{protected Icar car;public SuperCar(Icar car) {super();this.car = car;}@Overridepublic void move() {car.move();}
}
//具体的装饰角色
class Flycar extends SuperCar{public Flycar(Icar car) {super(car);}public void fly() {System.out.println("天上飞");}@Overridepublic void move() {super.move();fly();}
}
//具体的装饰角色
class Swimcar extends SuperCar{public Swimcar(Icar car) {super(car);}public void swim() {System.out.println("水下游");}@Overridepublic void move() {super.move();swim();}
}
//具体的装饰角色
class AIcar extends SuperCar{public AIcar(Icar car) {super(car);}public void autoMove() {System.out.println("自动");}@Overridepublic void move() {super.move();autoMove();}
}
public static void main(String[] args) {car car = new car();car.move();System.out.println("增加新的功能,飞行----------");//手动地给car添加功能Flycar flycar = new Flycar(car);flycar.move();System.out.println("既可以飞 又可以水下游");SuperCar car2 = new Flycar(car);Swimcar swimcar = new Swimcar(car2);swimcar.move();SuperCar car3 =  new Flycar(new Swimcar(new AIcar(new SuperCar(new car()))));car3.move();//自动、水下游、天上飞}

在这里插入图片描述总结:
1、装饰模式(Decorator)也叫包装器模式
2、装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类
3、 扩展对象功能,比继承灵活,不会导致类个数急剧增加
4、能够多次装饰,对不同的业务可以有多种组合
5、可以根据需要扩展装饰
弊端:
1、装饰者模式易出错,不容易调试错误
2、产生小的对象可能会影响性能

代理模式

将流程代码放到代理类中处理,通过代理控制对对象的访问。也是AOP(面向切面变成)的核心机制
举个例子:结婚可以选择专业的婚庆公司安排流程,原本没有婚庆公司新郎新娘就需要:准备工作->约酒店->节目安排->人员分工->结婚->其他事情。找了婚庆公司,婚庆公司就能完成准备工作->约酒店->节目安排->人员分工->其他事情。新郎新娘就只要完成结婚就行了。明星与经纪人也是,明星只要负责演出就行了,其余的琐事都是经纪人去完成

静态代理模式
Demo

public interface Star {void sing();}
public class RealStar implements Star {@Overridepublic void sing() {System.out.println("RealStar(明星本人).sing()");}}
public class ProxyStar implements Star {private Star star;public ProxyStar(Star star) {super();this.star = star;}@Overridepublic void sing() {System.out.println("ProxyStar.bookTicket()");System.out.println("ProxyStar.collectMoney()");System.out.println("ProxyStar.confer()");star.sing();}}

动态代理
通过一个处理器接口反射,动态代理生成类和对象
java.lang.reflect.InvocationHandler(处理器接口)
1、可以通过invoke方法实现对真实角色的代理访问。
2、每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象

public class StarHandler implements InvocationHandler{private Star realstar;public StarHandler(Star realstar) {super();this.realstar = realstar;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object object = null;if(method.getName().equals("sing")){object = method.invoke(realstar, null);}return object;}}

生成代理对象方式

		StarHandler handler = new StarHandler(realStar);Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[] {Star.class}, handler);

桥接模式
用于处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立 的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
桥接模式:其实就是通过桥把两个变化维度连在一起,让每个维度可以随意变化
在这里插入图片描述组合模式
将整个关系变成树形结构。
抽象构件(Component)角色: 定义了叶子和容器构件的共同点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色: 有容器特征,可以包含子节点,其中某个子类可以对Composite下所有子类操作
在这里插入图片描述外观模式
调用者减少跟每一个实体的使用
例如要注册某个公司,正常流程是:总经理去找工商局审核、去税务局登记、去银行开户等等
外观模式是实现了给总经理安排一个下手,下手去干这些事情,总经理只要一声令下
在这里插入图片描述在这里插入图片描述享元模式
享元模式是为了节省内存,将相同或相似的对象共享重用。
内部状态:可以共享,不会随环境变化而改变
外部状态:不可以共享,会随环境变化而改变

举个例子:
生产一种面包,它的大小颜色口味都是一样的,唯独最后打上的生产日期不一样。所以面包类应该有大小颜色口味等属性,唯独要专门弄一个生产日期的类给面包设定不一样的生产日期
在这里插入图片描述总结:
1、极大减少内存中对象的数量,因为不同批次的面包会有很多个面包类,但是用addDate类就只要控制addDate类
2、 相同或相似对象内存中只存一份,极大的节约资源,提高系统性能
3、外部状态相对独立,不影响内部状态

结构型模式总结
在这里插入图片描述

行为型模式

观察者模式

观察者模式就像一个广播,通常是1:N的方式。当一个目标对象(Subject)发生改变时,需要告知一系列观察者对象。举个例子:一个电台主播临时决定今晚不开播,就需要告诉那些关注他的人今天有事没有开播。这种情况下目标对象就是这个主播,观察者就是这些观众。
主要实现方式就是把观察者放入容器中,保持观察者跟目标对象的一致性

//目标对象基本方法
public class Subject {protected List<Observer> list = new ArrayList<Observer>();public void registerObserver(Observer obs){list.add(obs);}public void removeObserver(Observer obs){list.add(obs);}//通知所有的观察者更新状态public void notifyAllObservers(){for (Observer obs : list) {obs.update(this);}}}
public class ConcreteSubject extends Subject {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;//主题对象(目标对象)值发生了变化,请通知所有的观察者this.notifyAllObservers();} }
public interface Observer {void  update(Subject subject);
}
public class ObserverA implements Observer {private int myState;   //myState需要跟目标对象的state值保持一致!@Overridepublic void update(Subject subject) {myState = ((ConcreteSubject)subject).getState();}public int getMyState() {return myState;}public void setMyState(int myState) {this.myState = myState;}}
public static void main(String[] args) {//目标对象ConcreteSubject subject = new ConcreteSubject();//创建多个观察者ObserverA  obs1 = new ObserverA();ObserverA  obs2 = new ObserverA();ObserverA  obs3 = new ObserverA();//将这三个观察者添加到subject对象的观察者队伍中subject.registerObserver(obs1);subject.registerObserver(obs2);subject.registerObserver(obs3);//改变subject的状态subject.setState(3000);//我们看看,观察者的状态是不是也发生了变化System.out.println(obs1.getMyState());System.out.println(obs2.getMyState());System.out.println(obs3.getMyState());}

在这里插入图片描述应用:
Servlet中,监听器的实现
服务器对客户端的推送

责任链模式
将能够处理同一类请求的对象连成一条链,请求沿链传递,链上的对象能处理该请求就处理,不能就给下一个。举个例子:大学生请假,请假少于3天,辅导员就有权利批,大于3天小于7天,就得给院主任批,大于7天小于30天,就得给院长批,大于30天就让校长把你休学。
核心也是基于if else实现,不过不是if else 的嵌套,通过链表把这些负责人连接在一起。
Demo
请假信息封装

public class LeaveRequest {private String empName;private int leaveDays;private String reason;public LeaveRequest(String empName, int leaveDays, String reason) {super();this.empName = empName;this.leaveDays = leaveDays;this.reason = reason;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public int getLeaveDays() {return leaveDays;}public void setLeaveDays(int leaveDays) {this.leaveDays = leaveDays;}public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;} 
}

领导的类

public abstract class Leader {protected String name;protected Leader nextLeader; //责任链上的后继对象public Leader(String name) {super();this.name = name;}//设定责任链上的后继对象public void setNextLeader(Leader nextLeader) {this.nextLeader = nextLeader;}/*** 处理请求的核心的业务方法* @param request*/public abstract void handleRequest(LeaveRequest request);
}
public class Director extends Leader {public Director(String name) {super(name);}@Overridepublic void handleRequest(LeaveRequest request) {if(request.getLeaveDays()<3){System.out.println("学生:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("主任:"+this.name+",审批通过!");}else{if(this.nextLeader!=null){this.nextLeader.handleRequest(request);}}}}
public class Manager extends Leader {public Manager(String name) {super(name);}@Overridepublic void handleRequest(LeaveRequest request) {if(request.getLeaveDays()<7){System.out.println("学生:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("院长:"+this.name+",审批通过!");}else{if(this.nextLeader!=null){this.nextLeader.handleRequest(request);}}}}
public class GeneralManager extends Leader {public GeneralManager(String name) {super(name);}@Overridepublic void handleRequest(LeaveRequest request) {if(request.getLeaveDays()<30){System.out.println("学生:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("校长:"+this.name+",审批通过!");}else{System.out.println(request.getEmpName()+"回家休学,居然请假"+request.getLeaveDays()+"天!");}}}

在这里插入图片描述总结:
1、可以随时增加新的管理层
2、servlet过滤器的处理

迭代模式(iterator)
分为聚合对象(用于存储数据)和迭代器(用于遍历数据)。在set/map/list这些数据结构中都有应用

Demo-自定义迭代器

public interface MyIterator {void first();	//将游标指向第一个元素void next();	//将游标指向下一个元素boolean hasNext();//判断是否存在下一个元素boolean isFirst();boolean isLast();Object getCurrentObj();  //获取当前游标指向的对象
}
public class ConcreteMyAggregate {private List<Object> list = new ArrayList<Object>();public void addObject(Object obj){this.list.add(obj);}public void removeObject(Object obj){this.list.remove(obj);}public List<Object> getList() {return list;}public void setList(List<Object> list) {this.list = list;}//获得迭代器public MyIterator  createIterator(){return new ConcreteIterator();}//使用内部类定义迭代器,可以直接使用外部类的属性private class ConcreteIterator implements MyIterator {private int cursor;  //定义游标用于记录遍历时的位置,类似于c语言的指针@Overridepublic void first() {cursor = 0;}@Overridepublic Object getCurrentObj() {return list.get(cursor);}@Overridepublic boolean hasNext() {if(cursor<list.size()){return true;}return false;}@Overridepublic boolean isFirst() {return cursor==0?true:false;}@Overridepublic boolean isLast() {return cursor==(list.size()-1)?true:false;}@Overridepublic void next() {if(cursor<list.size()){cursor++;}}	}
}

中介者模式

一个项目不可能只是一个部门完成。需要多个部门完成,但是部门之间不应该乱七八糟地混为一滩,就需要一个中间者调动每个部门的事情。这个中间者就是中介者。这是结构就变成了这样
在这里插入图片描述中介模式UML总结:
1、解耦同级对象之间的交互关系。每个对象都持有中介者对象的引 用,有什么事情只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系
2、MVC中controller就是中介者模式

命令模式

对这个有很多理论的解释,就不说理论了。举个例子:国家给地方政府下达命令,地方政府不需要知道时谁下达的命令,国家也不需要知道是谁去执行命令,双方只要通过命令达成协议就行了。
写个Demo,就懂了

//调用者/发起者
public class Invoke {private Command command;   //也可以通过容器List<Command>容纳很多命令对象,进行批处理。数据库底层的事务管理就是类似的结构!public Invoke(Command command) {super();this.command = command;} //业务方法 ,用于调用命令类的方法public void call(){command.execute();}}
public interface Command {/*** 这个方法是一个返回结果为空的方法。* 实际项目中,可以根据需求设计多个不同的方法*/void execute();
}class ConcreteCommand implements Command {private Receiver receiver;	//命令的真正的执行者public ConcreteCommand(Receiver receiver) {super();this.receiver = receiver;}@Overridepublic void execute() {//命令真正执行前或后,执行相关的处理!receiver.action();}}
//真正执行的人,是不需要跟invoker有联系的
public class Receiver {public void action(){System.out.println("Receiver.action()");}
}

策略模式
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。 举个例子:在售货过程中,对新客户可能会给原价,对小批量的用户会打9折,对老客户会打8.5折,对老客户大批量打8折。用大量的if-else确实可以实现策略模式,但是代码可读性不强。策略模式就是专门用于实现算法分离。由client去选择策略。
在这里插入图片描述
状态模式
解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
在这里插入图片描述Context:维护一个State对象,让该对象的状态随时改变
ConcreteState具体状态类:每一个类又是一个状态

备忘录模式
Ctrl+Z相信大家都使用过,怎么把刚刚修改的东西恢复成原状,这就是备忘录模式。实现原理:保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
在这里插入图片描述Emp:为当前使用的对象
EmpMements是备忘对象,与emp属性保持一致
CareTaker:负责管理备忘的对象

Demo

//当前对象
public class Emp {private String ename;private int age;private double salary;//进行备忘操作,并返回备忘录对象public EmpMemento  memento(){return new EmpMemento(this);}//进行数据恢复,恢复成制定备忘录对象的值public void recovery(EmpMemento mmt){this.ename = mmt.getEname();this.age = mmt.getAge();this.salary = mmt.getSalary();}public Emp(String ename, int age, double salary) {super();this.ename = ename;this.age = age;this.salary = salary;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}	}
//管理备忘录
public class CareTaker {private EmpMemento memento;//	private List<EmpMemento> list = new ArrayList<EmpMemento>();public EmpMemento getMemento() {return memento;}public void setMemento(EmpMemento memento) {this.memento = memento;}}
//备忘录类
public class EmpMemento {private String ename;private int age;private double salary;public EmpMemento(Emp e) {this.ename = e.getEname();this.age = e.getAge();this.salary = e.getSalary();}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}}
public static void main(String[] args) {CareTaker taker = new CareTaker();Emp emp = new Emp("atcain", 20,0);System.out.println("第一次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());//第一次打印对象:atcain---20---0taker.setMemento(emp.memento());   //备忘一次emp.setAge(15);emp.setEname("hello");emp.setSalary(9000);System.out.println("第二次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());//第二次打印对象:hello---15---9000emp.recovery(taker.getMemento()); //恢复到备忘录对象保存的状态System.out.println("第三次打印对象:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());//第三次打印对象:atcain---20---0}

剩下解释器模式、访问者模式、模板方法模式很少见到过,如果以后学习的过程中遇到了,再加进来

行为型模式总结

在这里插入图片描述图源于百度,侵权删

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

相关文章

  1. LeetCode # 452 投飞镖刺破气球

    在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。一支弓箭可以沿着x轴从不同点完全垂直地…...

    2024/4/24 8:41:47
  2. JS 中提高代码质量/速度小技巧

    JS 中提高代码质量/速度小技巧 1. 类型强制转换 1.1 string强制转换为数字 可以用*1来转化为数字(实际上是调用.valueOf方法) 然后使用Number.isNaN来判断是否为NaN,或者使用 a !== a 来判断是否为NaN,因为 NaN !== NaN 32 * 1 // 32 ds * 1 // NaN nu…...

    2024/4/24 8:41:48
  3. 03-GitLab简单使用

    GitLab简单使用 1 登录系统 系统安装完成后,在浏览器中输入: http://yourip:8081 进行登录说明:开发私服一般使用ip地址 端口号默认为80,但管理员可能修改了端口号,比如此处使用的是8081 管理员使用root身份登录,初次登录需要修改密码 没有账号可以点击register进行注册普…...

    2024/5/10 8:33:11
  4. 程序设计实习MOOC 指针练习:指向指针的指针

    描述 程序填空使得输出指定结果 #include <iostream> using namespace std; int main() {int x,y,z;x = 10;y = 20;z = 30;int * a[3] = { &x, &y,&z};for( // 在此处补充你的代码 p < a + 3; ++p) cout<< * (*p) << endl;return 0;}输入 无…...

    2024/5/10 15:04:47
  5. 将跳转的页面写在iframe中,执行完成后跳出

    现状:a页面的js会调用 window.location.href = url 来跳转到 b 页面,然后 b执行完后会跳转到另一个页面。 需求:b页面的执行情况隐藏。 方法:使用iframe,调用b的url放到iframe中,然后b页面写一个跳出iframe的方法。<iframe id="diagnosisIframe" name="…...

    2024/4/24 8:41:47
  6. 美团研发岗笔试真题练习(编程题4)——最大矩形

    题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 输入描述: 输入一个仅包含’0’和’1’的二维字符数组。 第一行输入左大括号{,最后一行输入右大扩号}。 中间每行输入只包含’0’和’1’的字符数组*(字符数组的长度不超过20),…...

    2024/4/24 8:41:46
  7. 数据库系统概念笔记——第10章 存储和文件结构

    第10章 存储和文件结构 物理存储介质概述 大多数计算机系统中存在多种数据存储类型。可以根据访问数据的速度,购买介质时每单位数据的成本,以及介质的可靠性对这些存储介质进行分类。以下是几种有代表性的介质:高速缓冲存储器(cache)。高速缓冲存储器是最快最昂贵的存储介…...

    2024/5/10 8:12:07
  8. 按钮点击事件

    代码:按钮findViewBuId<Buttonandroid:id="@+id/mButton4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="跳转"app:layout_constraintLeft_toLeftOf="parent"app:layout_cons…...

    2024/4/24 8:41:44
  9. 20120-5-26

    jquery 的划入划出效果 $(".col-md-4").hover(function(){$(this).show(); }, function() {$(this).hide(); });百度富文本编辑器.工具栏浮动高度,编辑器高度,工具栏是否浮动 UE.getEditor(container, {topOffset : 60, initialFrameHeight : 600, autoFloatEnabled:…...

    2024/4/24 8:41:42
  10. Java集合类之Collection接口,集合的“爸爸”接口了解一下?

    目录什么是集合?集合和数组有什么区别?Collection接口如何遍历集合中的元素 Hello!没技术的大灰狼又来了,今天和小伙伴分享一个Java项目开发中比较常用的存储数据的方法----集合。 想到集合,可能很多小伙伴都会想到数组,那么集合和数组又有什么样的区别呢?且听大灰狼一一…...

    2024/4/24 8:41:38
  11. iOS实战开发之获取当前设备的网络类型,2G/3G/4G/WIFI

    在开发过程中,或多或少的考虑到用户的网络环境来加载不同的资源,提供用户体验,也是一种提升用户体验的途径。但是,苹果官方的开发SDK中并没有明确的类或者是接口来帮助我们简易的获取这个信息,目前针对苹果官方提供的Reachability类进行扩展实现此功能。希望对于有需要的同…...

    2024/4/25 20:21:13
  12. LeetCode # 435 不重叠的区间个数

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。…...

    2024/4/24 8:41:39
  13. 品优购电商系统开发第 7 章 六

    2.8 保存数据2.8.1 后端代码修改 pinyougou-sellergoods-interface 的 GoodsService.javapublic void update(Goods goods);修改 pinyougou-sellergoods-service 的 GoodsServiceImpl ,将 SKU 列表插入的代码提取出来,封装到私有方法中/** * 插入 SKU 列表数据 * @param goods…...

    2024/5/10 13:47:05
  14. 利用python爬取所有公司办公地址,并在百度地图个人开发平台标注。

    一、利用python爬取公司办公地址 IDLE编辑器,python3.8版本。 import requests from bs4 import BeautifulSoup import re import xlwt def getHTMLText(url, code=“utf-8”): kv={‘user-agent’:‘Mozilla/5.0’} try: r = requests.get(url,headers=kv) r.raise_for_statu…...

    2024/5/5 22:41:10
  15. 华为 USG6000防火墙配置镜像模式双机热备

    网络拓扑要求:企业前期是一台防火墙,为了提高网络可靠性,并且在不影响原先防火墙配置情况下,新增一台防火墙做双机热备。两台FW的业务接口都工作在三层,下行为三层核心交换机。上行为二层交换机连接运营商的接入点,运营商为企业分配的IP地址为100.1.1.1-100.1.1.6配置思路…...

    2024/5/7 16:57:17
  16. 利用Qt制作连续性图片

    有关于如何利用Qt使图片的连续性切换来达到动图的效果,下面给出事例:首先先看一看效果图:从上面可以看到–这是个连续性动图,是由一张张静态图片连续切换产生的。 要学会如何添加资源图片一直继续就行,然后先添加前缀再添加文件先在头文件定义函数部分然后在cpp文件里面完…...

    2024/4/28 19:39:56
  17. 【C++】游戏开发--基础

    文章目录使用调用堆栈进行内存存储谨慎使用递归使用指针存储内存地址在不同数据类型之间进行转换使用动态分配更有效地管理内存使用按位运算进行高级检查和优化 使用调用堆栈进行内存存储 C ++仍然是大多数游戏开发人员首选的语言,其主要原因是: 我们可以自己处理内存,在很大…...

    2024/4/28 0:10:39
  18. 阿里开源分布式限流框架 -Sentinel Go 0.3.0 发布,支持熔断降级能力

    作者 | 宿何 阿里巴巴高级开发工程师 Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统自适应保护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 承接了阿里巴巴近 10 年的 双11 大促流量的核心场…...

    2024/4/28 5:59:14
  19. GRE协议

    GRE简介 通用路由封装协议GRE(Generic Routing Encapsulation), 它实际上是一种封装协议,提供了将一种协议的报文封装在另一种协议报文中的机制。使报文能够在异种网 络中传输,异种报文传输的通道称为 tunnel (隧道)。 GRE采用了Tunnel(隧道)技术,是VPN(Virtual Privat…...

    2024/5/8 4:58:57
  20. 从鸡尾酒会问题入门语音分离

    前言 谷歌这篇文章《Looking to Listen at the Cocktail Party: A Speaker-Independent Audio-Visual Model for Speech Separation》,宣称“攻克”了鸡尾酒会问题。从提供的视频演示来看,可以通过滑动控制只听某一个人说话,非常神奇。这篇文章本身大概讲了这么一个事:提出…...

    2024/4/28 2:03:38

最新文章

  1. Chronos:学习时间序列的大语言模型(论文解读)

    前言 《Chronos: Learning the Language of Time Series》原文地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了中文翻译。还有部分最佳示例教程。如果有帮助到大家&#xff0c;请帮忙点亮…...

    2024/5/10 16:21:25
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/9 21:23:04
  3. 同一个pdf在windows和linux中的页数不一样

    之前认为PDF的格式&#xff0c;至少页数是不会变化的&#xff0c;结果最近发现一个文档在windows和linux中的页数不一样&#xff0c;linux中的pdf进入像word一样排版变得紧凑了&#xff0c;原本在下一页的几行进入了上一页的末尾。问了gpt后得到这样的回答&#xff1a; PDF文档…...

    2024/5/10 2:11:00
  4. OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理&#xff0c;该处理过程会对图像做高斯模糊化以保证图像在进行放大&#xff08;/缩小&#xff09;后尽可能保留源图像所展现的具体内容&#xff08;消除固定频率插值/采样带来的香农采样信息损失&#xff09;&#x…...

    2024/5/9 8:36:28
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/10 12:36:12
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/9 15:10:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

    2024/5/9 4:20:59
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/10 10:22:18
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/9 17:11:10
  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