package com.Test.DesignPattern;
public class Clone{
String Name;
int age;
String address;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package com.Test.DesignPattern;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Clone clone = new Clone();
clone.setAddress("Moon");
clone.setName("GuXue");
clone.setAge(18);
Clone clone2 = new Clone();
clone2.setAddress("Moon");
clone2.setName("Leave");
clone2.setAge(18);
}
}
创建了两个Clone对象,仅仅只有名字不同罢了,但是clone2却不能直接使用clone中的地址和年龄
package com.Test.DesignPattern;
public class Clone implements Cloneable {
String Name;
int age;
String address;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Clone clone() {
try {
return (Clone) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
package com.Test.DesignPattern;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Clone clone = new Clone();
clone.setAddress("Moon");
clone.setName("GuXue");
clone.setAge(18);
Clone clone2 = clone.clone();
clone2.setName("Leave");
}
}
这里在Clone中添加可以被作为引用的对象List
package com.Test.DesignPattern;
import java.util.List;
public class Clone implements Cloneable {
String Name;
int age;
String address;
List<String> friends;
public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Clone clone() {
try {
return (Clone) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
package com.Test.DesignPattern;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Clone clone = new Clone();
clone.setAddress("Moon");
clone.setName("GuXue");
clone.setAge(18);
List<String> friends = new ArrayList<String>();
friends.add("KK");
friends.add("Jinmu");
friends.add("DongDong");
clone.setFriends(friends);
Clone clone2 = clone.clone();
System.out.println("clone's friends:");
System.out.println(clone.getFriends());
System.out.println("clone2's friends:");
System.out.println(clone2.getFriends());
friends.add("Maya");
clone.setFriends(friends);
System.out.println("------------------------");
System.out.println("clone's friends:");
System.out.println(clone.getFriends());
System.out.println("clone2's friends:");
System.out.println(clone2.getFriends());
}
}
clone's friends:
[KK, Jinmu, DongDong]
clone2's friends:
[KK, Jinmu, DongDong]
------------------------
clone's friends:
[KK, Jinmu, DongDong, Maya]
clone2's friends:
[KK, Jinmu, DongDong, Maya]
深度克隆
public Clone clone() {
try {
Clone clone = (Clone) super.clone();
List<String> newFriends = new ArrayList<String>();
for (String friendString : this.getFriends()) {
newFriends.add(friendString);
}
clone.setFriends(newFriends);
return clone;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
clone's friends:
[KK, Jinmu, DongDong]
clone2's friends:
[KK, Jinmu, DongDong]
------------------------
clone's friends:
[KK, Jinmu, DongDong, Maya]
clone2's friends:
[KK, Jinmu, DongDong]
package com.Test.DesignPattern;
public class House {
private String floor;//地板
private String wall;// 墙
private String top;// 屋顶
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getTop() {
return top;
}
public void setTop(String top) {
this.top = top;
}
}
创建一个House类
package com.Test.DesignPattern;
public class Main {
public static void main(String[] args) {
House house = new House();
house.setFloor("地板");
house.setTop("屋顶");
house.setWall("墙");
}
}
由客户创建House对象
package com.Test.DesignPattern;
public interface HouseBuilder {
public void makeFloor();
public void makeWall();
public void makeHouseTop();
public House getHouse();
}
创建创建House的接口
package com.Test.DesignPattern;
public class PingFangBuilder implements HouseBuilder {
// 修建平房的工程队
House house = new House();
@Override
public void makeFloor() {
// TODO Auto-generated method stub
house.setFloor("平房的地板");
}
@Override
public void makeWall() {
// TODO Auto-generated method stub
house.setWall("平房的地板");
}
@Override
public void makeHouseTop() {
// TODO Auto-generated method stub
house.setTop("平房的屋顶");
}
@Override
public House getHouse() {
// TODO Auto-generated method stub
return house;
}
}
这是一个创建平房的House的类
package com.Test.DesignPattern;
public class GongYuBuilder implements HouseBuilder{
private House house;
@Override
public void makeFloor() {
// TODO Auto-generated method stub
house.setFloor("公寓的地板");
}
@Override
public void makeWall() {
// TODO Auto-generated method stub
house.setWall("公寓的墙");
}
@Override
public void makeHouseTop() {
// TODO Auto-generated method stub
house.setTop("公寓的房顶");
}
@Override
public House getHouse() {
// TODO Auto-generated method stub
return house;
}
}
这是创建公寓的House的类
HouseBuilder houseBuilder = new PingFangBuilder();
houseBuilder.makeFloor();
houseBuilder.makeHouseTop();
houseBuilder.makeWall();
House house1 = houseBuilder.getHouse();
HouseBuilder houseBuilder2 = new GongYuBuilder();
houseBuilder.makeFloor();
houseBuilder.makeHouseTop();
houseBuilder.makeWall();
House house2 = houseBuilder.getHouse();
但是弊端又来了,还是必须由用户去调用工程队的所有make函数
package com.Test.DesignPattern;
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder builder) {
this.houseBuilder = builder;
}
public void makeHouse() {
this.houseBuilder.makeFloor();
this.houseBuilder.makeHouseTop();
this.houseBuilder.makeWall();
}
}
public class Main {
public static void main(String[] args) {
HouseBuilder houseBuilder = new PingFangBuilder();
HouseBuilder gongyuBuilder = new GongYuBuilder();
HouseDirector houseDirector = new HouseDirector(houseBuilder);
// 创建一个平房
houseDirector.makeHouse();
House house = houseBuilder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getTop());
System.out.println(house.getWall());
// 创建一个公寓
HouseDirector houseDirector2 = new HouseDirector(gongyuBuilder);
House house2 = houseBuilder2.getHouse();
System.out.println(house2.getFloor());
System.out.println(house2.getTop());
System.out.println(house2.getWall());
}
}
不难发现,对于多种HouseBuilder的实现类。使用一个Dirctor来调用方法显得更快,代码复用更高
每个House都由用户创建,代码量最高,需求变换是几乎全部都要修改
使用HouseBuilder代码量中等,需求变化时较麻烦
使用Director,代码量最少,需要改变时仅修改Director传入的HouseBuilder就可以了
现代汽车都能跑
但是随着时代发展,未来汽车也许能飞
package com.Test.DesignPattern;
public class RunCar {
public void run() {
System.out.println("跑");
}
public void fly() {
System.out.println("飞");
}
public void swim() {
System.out.println("游");
}
public void show(){
System.out.println("拥有的功能");
this.run();
this.fly();
this.swim();
}
}
但是 不是所有的Car 都以 飞,跑,游,所以直接创建一个类具有这三个特性是不合适的
package com.Test.DesignPattern;
public interface Car {
public void show();
public void run();// 一般车都可以跑
}
创建Car的接口,show为展示功能,一般车都能跑,故加上run
package com.Test.DesignPattern;
public class Car implements Car {
@Override
public void show() {
// TODO Auto-generated method stub
this.run();
}
public void run() {
System.out.println("可以跑");
}
}
只能跑的车
package com.Test.DesignPattern;
public class FlyCar implements Car {
@Override
public void show() {
// TODO Auto-generated method stub
this.fly();
this.run();
}
public void fly() {
System.out.println("可以飞");
}
public void run() {
System.out.println("可以跑");
}
}
在run之上,可以飞的车
package com.Test.DesignPattern;
public class SwimCar implements Car {
@Override
public void show() {
// TODO Auto-generated method stub
this.run();
this.swim();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("可以跑");
}
public void swim() {
System.out.println("可以游");
}
}
在run之上可以游的车
package com.Test.DesignPattern;
public abstract class CarDecorator implements Car {
private Car car;
public Car getCar() {
return car;
}
public CarDecorator(Car car) {
this.car = car;
}
public abstract void show();
}
抽象的装饰类,实现Car接口是为了能够多重装饰
package com.Test.DesignPattern;
public class SwimCarDecorator extends CarDecorator {
public SwimCarDecorator(Car car) {
super(car);
// TODO Auto-generated constructor stub
}
public void show() {
this.getCar().show(); // 先展示出以前的功能
this.swim(); // 再添加新的功能
}
public void swim() {
System.out.println("可以游");
}
public void run() {
// TODO Auto-generated method stub
}
}
添加游泳能力的Car
package com.Test.DesignPattern;
public class FlyCarDecorator extends CarDecorator {
public FlyCarDecorator(Car car) {
super(car);
}
public void show() {
this.getCar().show();
this.fly();
}
public void fly() {
System.out.println("飞");
}
public void run() {
// TODO Auto-generated method stub
}
}
添加飞能力的Car
public class Main {
public static void main(String[] args) {
Car Car = new RunCar();
CarDecorator carDecorator = new FlyCarDecorator(Car);
carDecorator.show();
CarDecorator carDecorator2 = new SwimCarDecorator(carDecorator);
carDecorator2.show();
}
}
先创建一个Car,然后给Car添加上飞的功能
因为这里的carDecorator是CarDecorator类型,而SwimCardecorator的传入参数是Car类型,所以CarDecorator需要实现Car接口,以实现多重装饰
package com.Test.DesignPattern;
public class MD5Strategy implements Strategy {
@Override
public void encrypt() {
// TODO Auto-generated method stub
System.out.println("MD5的加密");
}
}
策略抽象接口类
package com.Test.DesignPattern;
public class MDSStrategy implements Strategy{
@Override
public void encrypt() {
// TODO Auto-generated method stub
System.out.println("非MD5的实现,执行MDS加密");
}
}
具体实现的算法1
package com.Test.DesignPattern;
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void encrypt() {
this.strategy.encrypt();
}
}
具体实现的算法2
Context context = new Context(new MD5Strategy);
context.encrypy();
使用策略模式封装一层Context,对外使用的方法都是encrypy
若要修改实现算法,则传入Context的参数可以修改为 new MDSStrategy
Strategy:策略(算法)抽象
ConcreteStrategy:各种策略(算法)的具体实现
Context:策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定
优点:
package com.Test.DesignPattern;
import java.util.Observable;
@SuppressWarnings("deprecation")
public class Person extends Observable {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.setChanged();
this.notifyObservers(name);
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.setChanged();
this.notifyObservers(sex);
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person类,具有name,age,sex三个属性。在Observe中监听这三个属性的变换
package com.Test.DesignPattern;
import java.util.Observable;
import java.util.Observer;
@SuppressWarnings("deprecation")
public class MyObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("对象改变" + (String)arg);
}
}
自定义的监听类,每次监听对象改变的时候就会输出“对象改变”
package com.Test.DesignPattern;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Person person = new Person();
MyObserver observer1 = new MyObserver();
MyObserver observer2 = new MyObserver();
person.addObserver(observer1);//添加观察者
person.addObserver(observer2);
person.setName("test");
person.setSex("nv");
person.setAge(18);
person.deleteObserver(observer1);// 删除观察者
}
}
需要通过addObserver来注册观察者