設計模式分為三類公23種:
1. 創建型模式:單例模式、簡單工廠模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。
2.結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
4.行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式。
1.單列模式
/**
* 餓漢設計模式
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:16:11
* @version V1.0
*/
public class Student {
//私有化構造函數 讓外界不能創建對象
private Student(){
}
private static Student instance = new Student();
public static Student getInstance(){
return instance;
}
}
/**
* 懶漢模式
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:20:43
* @version V1.0
*/
public class Person {
//私有化構造函數
private Person(){
}
private static Person person = null;
//為了解決安全問題加了同步
public synchronized static Person getInstance(){
if(person == null){
person = new Person();
}
return person;
}
}
2.簡單工廠模式
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨頭");
}
}
/**
* 簡單工廠
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:44:15
* @version V1.0
*/
public class AnimalFactory {
public AnimalFactory(){
}
//創建對象
public static Animal createAnimal(String name){
if("dog".equals(name)){
return new Dog();
}else if("cat".equals(name)){
return new Cat();
}
return null;
}
}
/**
* 演示
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:52:43
* @version V1.0
*/
public class AnimalDemo {
public static void main(String[] args) {
Dog dog = (Dog)AnimalFactory.createAnimal("dog");
dog.eat();
Cat cat = (Cat)AnimalFactory.createAnimal("cat");
cat.eat();
}
}
3.工廠方法模式
public abstract class Animal {
abstract void eat();
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨頭");
}
}
public interface AnimalFactory {
Animal createAnimal();
}
//工廠方法
public class CatFactory implements AnimalFactory{
@Override
public Animal createAnimal() {
return new Cat();
}
}
//工廠方法
public class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
4.抽象工廠模式
//電腦接口
public interface Computer {
void sellMoney();
}
//手機接口
public interface Phone {
void sellNum();
}
//蘋果的電腦實現類
public class AppleComputer implements Computer {
@Override
public void sellMoney() {
System.out.println("蘋果電腦買10000元");
}
}
//蘋果的手機實現類
public class ApplePhone implements Phone {
@Override
public void sellNum() {
System.out.println("蘋果手機本月銷量500萬臺");
}
}
//小米電腦接口實現類
public class XiaomiComputer implements Computer {
@Override
public void sellMoney() {
System.out.println("小米電腦賣4999");
}
}
//小米手機實現類
public class XiaomiPhone implements Phone {
@Override
public void sellNum() {
System.out.println("小米本月賣了1000萬臺");
}
}
//工廠接口
public interface Factory {
Phone createPhone();
Computer createComputer();
}
// apple電腦和手機的工廠實現類
public class AppleFactory implements Factory {
@Override
public Phone createPhone() {
return new ApplePhone();
}
@Override
public Computer createComputer() {
return new AppleComputer();
}
}
//小米工廠實現類
public class XiaomiFactory implements Factory {
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
@Override
public Computer createComputer() {
return new XiaomiComputer();
}
}
//演示類
public class Demo {
public static void main(String[] args) {
XiaomiFactory xf = new XiaomiFactory();
XiaomiComputer xc = (XiaomiComputer) xf.createComputer();
XiaomiPhone xp = (XiaomiPhone) xf.createPhone();
xc.sellMoney();
xp.sellNum();
AppleFactory af = new AppleFactory();
AppleComputer ac = (AppleComputer) af.createComputer();
ApplePhone ap = (ApplePhone) af.createPhone();
ac.sellMoney();
ap.sellNum();
}
}
適配器模式
//方法接口
public interface UserDao {
void add();
void update();
void delete();
void query();
}
//適配器模式 通過實現空方法為了讓UserDaoImpl 可以選擇性的重寫方法
public class UserAdapter implements UserDao {
@Override
public void add() {
}
@Override
public void update() {
}
@Override
public void delete() {
}
@Override
public void query() {
}
}
public class UserDaoImpl extends UserAdapter {
@Override
public void add() {
System.out.println("執行了增加操作");
}
}
//演示
public class UserDemo {
public static void main(String[] args) {
UserDaoImpl userDaoImpl = new UserDaoImpl();
userDaoImpl.add();
}
}
1.裝飾者模式
裝飾者模式定義:在不改變原有對象的基礎上附加功能,相比生成子類更靈活。
適用場景:動態的給一個對象添加或者撤銷功能。
優點:可以不改變原有對象的情況下動態擴展功能,可以使擴展的多個功能按想要的順序執行,以實現不同效果。
缺點:更多的類,使程序復雜
類型:結構型。
/**
* User 抽象組件
* UserImpl 具體實現
* Decorator 抽象裝飾者
* SeeDecorator 具體裝飾者
* DrinkDecorator 具體裝飾者
*/
//最高層抽象類
public interface User {
void doEat();
}
//具體實現類
public class UserImpl implements User {
@Override
public void doEat() {
System.out.println("正在吃著飯");
}
}
//裝飾抽象類
public abstract class Decorator implements User{
//很重要,組合抽象構件到自己的類中
private User user;
public Decorator(User user){
this.user = user;
}
@Override
public void doEat(){
this.user.doEat();
};
}
//裝飾具體類
public class DrinkDecorator extends Decorator{
public DrinkDecorator(User user) {
super(user);
}
@Override
public void doEat() {
super.doEat();
System.out.println("還喝著水");
}
}
//裝飾具體類
public class SeeDecorator extends Decorator {
public SeeDecorator(User user) {
super(user);
}
@Override
public void doEat() {
super.doEat();
System.out.println("還看著電視");
}
}
模板模式
定義:定義一個操作中的算法骨架,將一些步驟聲明為抽象方法迫使子類去實現。不同的子類可以以不同的方式實現這些抽象方法
簡單理解就是:將關鍵的業務方法、邏輯或算法封裝起來,而把具體的一些容易變化的步驟留給之類來進行具體不同的設置,具體表現就是實現了父類的方法
/**
* MyTemplate 模板抽象類
* CustomerDaoImpl 模板子類
* StudentDaoImpl 模板子類
* Demo 演示類
*/
//模板抽象類
public abstract class MyTemplate {
//骨架不讓子類重寫
public final void execute(){
start();
//用鉤子做判斷
if(flag()){
run();
}
end();
}
//在模板方法中有一種函數叫做鉤子函數,鉤子函數的作用是讓實現類可以通過一些方法來控制模板中的流程
public abstract boolean flag();
public abstract void run();
public void start(){
System.out.println("begin connection...");
}
public void end(){
System.out.println("end connection...");
}
}
//模板子類
public class CustomerDaoImpl extends MyTemplate {
@Override
public boolean flag() {
return true;
}
@Override
public void run() {
System.out.println("操作用戶數據");
}
}
//模板子類
public class StudentDaoImpl extends MyTemplate {
@Override
public boolean flag() {
return false;
}
@Override
public void run() {
System.out.println("操作學生數據");
}
}
//演示類
public class Demo {
public static void main(String[] args) {
MyTemplate t1 = new CustomerDaoImpl();
t1.execute();
MyTemplate t2 = new StudentDaoImpl();
t2.execute();
}
}
//結果:
//begin connection...
//操作用戶數據
//end connection...
//begin connection...
//end connection...
代理模式--靜態代理
/*
* 靜態代理
* BuyHouse 接口
* BuyHouseImpl 接口實現類
* BuyHouseProxy 代理類
* Demo 演示類
*/
//接口
public interface BuyHouse {
void doing();
}
//接口實現類
public class BuyHouseImpl implements BuyHouse {
@Override
public void doing() {
System.out.println("正在買房。。。");
}
}
//靜態代理類
public class BuyHouseProxy implements BuyHouse {
private BuyHouse buyHouse;
public BuyHouseProxy(BuyHouse buyHouse){
this.buyHouse = buyHouse;
}
@Override
public void doing() {
System.out.println("開始買房");
this.buyHouse.doing();
System.out.println("買房結束");
}
}
//演示類
public class Demo {
public static void main(String[] args) {
BuyHouseProxy bp = new BuyHouseProxy(new BuyHouseImpl());
bp.doing();
}
}
//結果:
//開始買房
//正在買房。。。
//買房結束
代理模式--jdk動態代理
/**
* jdk利用反射動態代理
* BuyHouse 接口
* BuyHouseImpl 接口實現類
* DynamicInvocationHandler 代理實現類
* Demo 演示類
*/
//接口
public interface BuyHouse {
void doing();
}
//接口實現類
public class BuyHouseImpl implements BuyHouse {
@Override
public void doing() {
System.out.println("正在買房。。。");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//動態代理實現類
public class DynamicInvocationHandler implements InvocationHandler {
private BuyHouse buyHouse;
public DynamicInvocationHandler(BuyHouse buyHouse) {
this.buyHouse = buyHouse;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("開始買房");
Object invoke = method.invoke(buyHouse, args);
System.out.println("買房結束");
return invoke;
}
}
import java.lang.reflect.Proxy;
//演示
public class Demo {
public static void main(String[] args) {
BuyHouse buyHouse = new BuyHouseImpl();
DynamicInvocationHandler h = new DynamicInvocationHandler(buyHouse);
BuyHouse b = (BuyHouse)Proxy.newProxyInstance(buyHouse.getClass().getClassLoader(), buyHouse.getClass().getInterfaces(), h);
b.doing();
}
}
//結果:
//開始買房
//正在買房。。。
//買房結束