23种设计模式

 分类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

1、简单工厂模式:就是建立一个工厂类,对实现同一接口的子类或者继承同一父类的子类,进行实例创建。

public class Test {
    public static void main(String[] args) {
        Operation oper;
        oper = OperationFactory.createOperation(2);
        oper.numberA = 1;
        oper.numberB = 2;
        System.out.println(oper.getResult());
    }
}
//运算类
class Operation
{
    public double numberA = 0;
    public double numberB = 0;
    
    public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }
    
    public double getResult() {
        return 0;
    }
}
//加法类继承运算类
class OperationAdd extends Operation
{
    public double getResult() {
        return numberA + numberB;
    }
    
}
//减法类继承运算类
class OperationSub extends Operation
{
    public double getResult() {
        return numberA - numberB;
    }

}
//工厂类
class OperationFactory
{
    public static Operation createOperation(int operate) {
        Operation oper = null;
        switch (operate) {
        case 1:
            oper = new OperationAdd();
            break;
        case 2:
            oper = new OperationSub();
            break;
        }
        return oper;
    }
}

2、策略模式:  定义了一系列算法,并将每个封装起来,使他们可以互相替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列的实现类提供统一的方法,多个实现类实现该接口。

收银系统,结算界面的功能。结算时有活动:1、打折,可以8折,9折,5折,折扣可以抽象出一个算法  2、满减,满300减100,满1000减400等,抽象出一个。关键点在于封装其变化点

package strategy;

public class Context {
	Strategy strategy;
	
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	//上下文接口
	public void ContextInterface() {
		//根据具体的策略对象调用方法
		strategy.AlgorithmInterface();
	}
}

  

package strategy;

public class ConcreteStrategyA extends Strategy {

	@Override
	public void AlgorithmInterface() {
		System.out.println("算法A实现");
	}

}
package strategy;

public class ConcreteStrategyB extends Strategy {

	@Override
	public void AlgorithmInterface() {
		System.out.println("算法B实现");
	}

}
package strategy;

public class ConcreteStrategyC extends Strategy {

	@Override
	public void AlgorithmInterface() {
		System.out.println("算法C实现");
	}

}

  

package strategy;

public class Context {
	Strategy strategy;
	
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	//上下文接口
	public void ContextInterface() {
		//根据具体的策略对象调用方法
		strategy.AlgorithmInterface();
	}
}

  

package strategy;

public class test {
	
	public static void main(String[] args) {
		Context context;
		context = new Context(new ConcreteStrategyA());
		context.ContextInterface();
		
		context = new Context(new ConcreteStrategyB());
		context.ContextInterface();
		
		context = new Context(new ConcreteStrategyB());
		context.ContextInterface();
	}
                              
}

3、装饰者模式:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

package decorator;
//定义一个对象接口,可以给这些对象动态添加职责
public abstract class Component {
	public abstract void Operation();
}

  

package decorator;

public class ConcreteComponent extends Component {

	@Override
	public void Operation() {
		System.out.println("被装饰的对象!!!");
	}

}

  

package decorator;

public abstract class Decorator extends Component {
	public Component component;
	
	public void setComponent(Component component) {
		this.component = component;
	}

	@Override
	public void Operation() {
		if(component != null){
			component.Operation();
		}
	}

}

  

package decorator;

public class ConcreteDecoratorA extends Decorator {

	@Override
	public void Operation() {
		super.Operation();
		System.out.println("具体装饰对象A的操作!!");
	}
	
	public void setComponent(Component component) {
		this.component = component;
	}

}

  

package decorator;

public class ConcreteDecoratorB extends Decorator {

	@Override
	public void Operation() {
		super.Operation();
		AddedBehavior();
		System.out.println("具体装饰对象B的操作!!");
	}
	
	private void AddedBehavior() {
		
	}

}

  

package decorator;

public class test {
	
	public static void main(String[] args) {
		ConcreteComponent c = new ConcreteComponent();
		ConcreteDecoratorA d1 = new ConcreteDecoratorA();
		ConcreteDecoratorB d2 = new ConcreteDecoratorB();
		
		d1.setComponent(c);
		d2.setComponent(d1);
		d2.Operation();
	}			
}

  结果:

    被装饰的对象!!!
    具体装饰对象A的操作!!
    具体装饰对象B的操作!!

4、代理模式(Proxy):代理模式就是多一个代理类出来,替原对象进行一些操作。

package proxy;

public interface Subject {
	public abstract void request();

}

  

package proxy;

public class RealSubject implements Subject{

	@Override
	public void request() {
		System.out.println("真实的请求!!!");
	}

}

  

package proxy;

public class Proxy implements Subject{
	RealSubject realSubject;

	@Override
	public void request() {
		if(realSubject == null){
			realSubject = new RealSubject();
		}
		realSubject.request();
	}
}

  

package proxy;

public class test {
	public static void main(String[] args) {
		Proxy p = new Proxy();
		p.request();
	}
}

5、工厂方法模式: 

6、原型模式: 

7、模板方法模式:

8、外观模式:

9、建造者模式:主要是用于创建一些复杂的对象,这些对象内部构建的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。

10、观察者模式:

猜你喜欢

转载自www.cnblogs.com/xingrui/p/8503503.html