标签:ldb 另一个 角色 必须 出租房 系统资源 实例化 解释器 层次结构
每个设计模式已经实现
https://gitee.com/longzhiquan/design_patterns23
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
适用:当要实例化的类是在运行时刻指定时;或者需要创建多个对象并且这些对象内部状态相差不大
package pattern.prototype.demo1;
import java.util.Date;
public class Video implements Cloneable{
private String name;
private Date date;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Video() {
}
public Video(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Video{" +
"name=‘" + name + ‘\‘‘ +
", date=" + date +
‘}‘;
}
}
package pattern.prototype.demo1;
import java.util.Date;
public class Test {
//有对象Date的问题
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Video v1 = new Video("hhh",date);
System.out.println(v1.hashCode());
System.out.println(v1.toString());
Video v2 = (Video) v1.clone();
System.out.println(v2.hashCode());
System.out.println(v2.toString());
}
}
package pattern.prototype.demo2;
import java.util.Date;
public class Video implements Cloneable{
private String name;
private Date date;
//解决Date问题
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
Video v = (Video) object;
v.date = (Date) this.date.clone();
return object;
}
public Video() {
}
public Video(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Video{" +
"name=‘" + name + ‘\‘‘ +
", date=" + date +
‘}‘;
}
}
package pattern.prototype.demo2;
import java.util.Date;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Video v1 = new Video("hhh",date);
System.out.println(v1.hashCode());
System.out.println(v1.toString());
Video v2 = (Video) v1.clone();
System.out.println(v2.hashCode());
System.out.println(v2.toString());
date.setTime(12345678);
System.out.println(v1.hashCode());
System.out.println(v1.toString());
System.out.println(v2.hashCode());
System.out.println(v2.toString());
}
}
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类
适用:当一个类不知道它所必须创建的对象的类的时候
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
适用:一个系统要独立于它的产品的创建、组合和表示时
与工厂模式的区别:工厂模式的一个工厂接口的子类只能实例化一个产品;抽象工厂能实例多个产品
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
适用:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
package pattern.builder.demo1;
public abstract class Builder {
abstract void buildA(); //第一步
abstract void buildB(); //第二步
abstract void buildC(); //第三步
abstract Product geProduct();
}
package pattern.builder.demo1;
//工作者
public class Worker extends Builder {
private Product product;
public Worker(){
product = new Product();
}
@Override
void buildA() {
product.setBuildA("1");
}
@Override
void buildB() {
product.setBuildB("2");
}
@Override
void buildC() {
product.setBuildC("3");
}
@Override
Product geProduct() {
return product;
}
}
package pattern.builder.demo1;
//指挥者
public class Director {
public Product build(Builder builder){
builder.buildA();
builder.buildB();
builder.buildC();
return builder.geProduct();
}
}
package pattern.builder.demo1;
public class Product{
private String buildA;
private String buildB;
private String buildC;
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
@Override
public String toString() {
return "Product{" +
"buildA=‘" + buildA + ‘\‘‘ +
", buildB=‘" + buildB + ‘\‘‘ +
", buildC=‘" + buildC + ‘\‘‘ +
‘}‘;
}
}
package pattern.builder.demo1;
public class Test {
public static void main(String[] args) {
Director director = new Director();
Product build = director.build(new Worker());
System.out.println(build);
}
}
package pattern.builder.demo2;
public abstract class Builder {
abstract Builder buildA(String a);
abstract Builder buildB(String a);
abstract Builder buildC(String b);
abstract Product build();
}
package pattern.builder.demo2;
public class Product {
private String buildA = "1";
private String buildB = "2";
private String buildC = "3";
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
@Override
public String toString() {
return "Product{" +
"buildA=‘" + buildA + ‘\‘‘ +
", buildB=‘" + buildB + ‘\‘‘ +
", buildC=‘" + buildC + ‘\‘‘ +
‘}‘;
}
}
package pattern.builder.demo2;
public class Worker extends Builder{
private Product product;
public Worker(){
product = new Product();
}
@Override
Builder buildA(String a) {
product.setBuildA(a);
return this;
}
@Override
Product build() {
return product;
}
@Override
Builder buildB(String b) {
product.setBuildB(b);
return this;
}
@Override
Builder buildC(String c) {
product.setBuildC(c);
return this;
}
}
package pattern.builder.demo2;
public class Test {
public static void main(String[] args) {
Worker worker = new Worker();
Product product = worker
.buildA("5")
.buildC("6")
.build();
System.out.println(product);
}
}
定义:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
角色:适配器(Adapter)、被适配类、对象(Adaptee)
理解:客户需要Target,现实只有Adaptee,可以用一个实现Target协议的适配器通过类继承或者对象组合类获得被Adaptee。
定义:为子系统中一组不同的接口提供统一的接口,一致的界面。
外观(Facade)模式包含以下主要角色。
可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
桥接(Bridge)模式包含以下主要角色。
package pattern.bridge;
public interface Branch {
void info();
}
package pattern.bridge;
public abstract class Computer {
private Branch branch;
public Computer(Branch branch){
this.branch = branch;
}
public void info(){
branch.info();
}
}
class Desktop extends Computer{
public Desktop(Branch branch) {
super(branch);
}
@Override
public void info() {
super.info();
System.out.println("台式机");
}
}
class Laptop extends Computer{
public Laptop(Branch branch) {
super(branch);
}
@Override
public void info() {
super.info();
System.out.println("笔记本");
}
}
package pattern.bridge;
public class Huawei implements Branch{
@Override
public void info() {
System.out.println("华为");
}
}
package pattern.bridge;
public class Xiaomi implements Branch {
@Override
public void info() {
System.out.println("小米");
}
}
package pattern.bridge;
public class Test {
public static void main(String[] args) {
Computer computer = new Laptop(new Huawei());
computer.info();
}
}
定义:动态的给对象添加一些额外的功能,就增加功能来说,装饰比生成子类更为灵活。
角色:组件接口(Component)、具体的组件、继承至Component的修饰接口(Decorator)、具体的修饰
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
角色:客户端(Client)、目标接口(subject)代理对象(Proxy)、真正的目标对象(RealSubject)
package pattern.proxy.demo1;
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
package pattern.proxy.demo1;
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东出租房");
}
}
package pattern.proxy.demo1;
public class Proxy implements Rent{
private Host host;
public Proxy(Host host) {
this.host = host;
}
@Override
public void rent() {
host.rent();
}
public void see(){
System.out.println("看房");
}
}
package pattern.proxy.demo1;
public interface Rent {
public void rent();
}
package pattern.proxy.demo2;
public class Client {
public static void main(String[] args) {
UserServiceImp userServiceImp = new UserServiceImp();
UserProxy userProxy = new UserProxy();
userProxy.setUserServiceImp(userServiceImp);
userProxy.add();
}
}
package pattern.proxy.demo2;
public class UserProxy implements UseService{
private UserServiceImp userServiceImp;
public void setUserServiceImp(UserServiceImp userServiceImp) {
this.userServiceImp = userServiceImp;
}
@Override
public void add() {
log("1");
userServiceImp.add();
}
@Override
public void delete() {
log("2");
userServiceImp.delete();
}
@Override
public void update() {
log("4");
userServiceImp.update();
}
@Override
public void query() {
log("3");
userServiceImp.query();
}
public void log(String msg){
System.out.println(msg);
}
}
package pattern.proxy.demo2;
public class UserServiceImp implements UseService{
@Override
public void add() {
System.out.println("add");
}
@Override
public void delete() {
System.out.println("delete");
}
@Override
public void update() {
System.out.println("update");
}
@Override
public void query() {
System.out.println("query");
}
}
package pattern.proxy.demo2;
public interface UseService {
void add();
void delete();
void update();
void query();
}
组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
组合模式包含以下主要角色。
享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
策略模式的主要角色如下。
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
可以将系统中的相关操作抽象成命令,使调用者与实现者相关分离,其结构如下。
命令模式包含以下主要角色。
唱歌比赛,成功与否
用一个方法遍历不同类型的集合或数组数据。
不同公司调用相同的天气公司的接口
一个具体类发送命令给中介,中介调用另一个具体类执行
备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
购买物品,第一个没有权限就轮到下一个人。
标签:ldb 另一个 角色 必须 出租房 系统资源 实例化 解释器 层次结构
原文地址:https://www.cnblogs.com/longzhistudy/p/12623359.html