接口 工厂设计模式 代理设计模式

接口
接口就是抽象方法和全局常量的集合。
1、定义接口使用关键字interface 接口名称使用I表示
2、接口中的数据成员默认为 public static final
接口中的方法默认为 Public abstract
3、接口内不能有已经实现的方法。
4、接口不能实例化 IMessage imessage = new IMessage();
5、接口可以继承多个接口,此时的接口拥有了继承接口里面的抽象方法
6、如果一个抽象类的继承接口,那么抽象类当中可以不实现接口的方法
但是如果再有一个普通类继承了此抽象类,那么普通类一定要实现接口
定义接口
定义IMessage接口

public interface IMessage {
    String MSG="hello bit";
    void print();
}

定义INews接口

public interface INews {
    String getNews();
}

子类QQMessagelmp实现接口

5、接口可以继承多个接口,此时的接口拥有了继承接口里面的抽象方法
class QQMessagelmp implements IMessage ,INews{
    @Override
    public void print() {
        System.out.println("QQMessage");
    }

    @Override
    public String getNews() {
        return IMessage.MSG;
    }
}

测试类

public class TestDemo1 {
public static void main(String[] args) {
        IMessage iMessage=new QQMessagelmp();
        iMessage.print();

         INews iNews2=(INews)iMessage; //  INews类型 强转为 IMessage类型
        System.out.println(iNews2.getNews());

        IMessage qqMessagelmp=new QQMessagelmp();//子类向上转型,为父接口实例化对象
        qqMessagelmp.print();//调用被子类覆写过的方法

        INews iNews=new QQMessagelmp();
        //((QQMessagelmp) iNews).print();
        System.out.println(iNews.getNews());
}

简单工厂模式
简单工厂模式:专门定义一个类用来创建其它类的实例,被创建的实例通常都具有相同的父类。
1、一个抽象类产品
2、具体产品类
3、一个工厂
4、客户端
优点:简单易于实现
把类的实例化交给工厂,易于解耦
缺点:添加具体产品需要修改工厂违反OCP开放封闭原则
例如:创建生产电脑的工厂
Computer 接口 1、一个抽象类产品

package com.bit.src;

public interface Computer {
    void printComputer();
}

三种类型的电脑(子类) MacBookComputer 、SurfaceBookComputer、MIComputer
来实现Computer接口 2、具体产品类

package com.bit.src;

public class MacBookComputer implements Computer {

    @Override
    public void printComputer() {
        System.out.println("MacBook电脑");
    }
}
package com.bit.src;

public class SurfaceBookComputer implements Computer{
    @Override
    public void printComputer() {
        System.out.println("SurfaceBook电脑");
    }
}
package com.bit.src;

public class MIComputer implements Computer{
    @Override
    public void printComputer() {
        System.out.println("小米电脑");
    }
}

工厂类ComputerFactory 3、一个工厂

package com.bit.src;
把类的实例化交给工厂,易于解耦
public class ComeputerFactory {
    public static Computer getInstance(String type) {
        Computer computer = null;
        switch (type) {
            case "MAC":
                computer = new MacBookComputer();
                break;
            case "SUR":
                computer = new SurfaceBookComputer();
                break;
            case "MI":
                computer = new MIComputer();
                break;
                default:
                    System.out.println("请输入正确的电脑型号");
        }
        return computer;


    }
}

客户端类 (Client)

package com.bit.src;

import java.util.Scanner;

public class Client {
    public static void buyComputer(Computer computer){
        computer.printComputer();
    }

    public static void main(String[] args) {
        System.out.println("请输入你要的电脑型号");
        Scanner scanner=new Scanner(System.in);
        String type=scanner.nextLine();
        buyComputer(ComeputerFactory.getInstance(type));
        }
}

工厂方法模式
工厂方法模式:定义一个用来创建对象的接口,让子类决定实例化哪一个类,让子类决定实例化延迟到子类
1、一个抽象产品类
2、多个具体产品类
3、一个抽象工厂
4、多个具体工厂-每一个具体产品对应一个具体工厂
优点
1、降低了代码耦合度,对象的⽣成交给子类去完成
实现了开放封闭原则 - 每次添加子产品 不需要修改原有代码
缺点:
2、增加了代码量,每个具体产品都需要一个具体工⼚
当增加抽象产品 也就是添加一个其他产品族 需要修改⼯厂 违背OCP
1、一个抽象产品类

package com.bit.src;

public interface Computer {
    void printComputer();
}

2、多个具体产品类

package com.bit.src;

public class MacBookComputer implements Computer {

    @Override
    public void printComputer() {
        System.out.println("MacBook电脑");
    }
}
package com.bit.src;

public class SurfaceBookComputer implements Computer{
    @Override
    public void printComputer() {
        System.out.println("SurfaceBook电脑");
    }
}

3、一个抽象工厂

package com.bit.src;

public interface ComputerFactory {
        Computer createComputer();
}

4、多个具体工厂-每一个具体产品对应一个具体工厂

package com.bit.src;

public interface ComputerFactory {
        Computer createComputer();
}

5、客户端

package com.bit.src;


public class Client {

    public static void buyComputer(Computer computer){
        computer.printComputer();
    }
    public static void main(String[] args) {
     ComputerFactory ComputerFactory=new AppleFactory();
     Computer computer=ComputerFactory.createComputer();
     buyComputer(computer);
    }
}

抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它的具体的类。
1、多个抽象产品类
2、具体产品类
3、抽象工厂类 - 声明(一组)返回抽象产品的方法
4、具体工厂类 - 生成(一组)具体产品
优点
代码解耦
实现多个产品族(相关联产品组成的家族),而⼯⼚⽅法模式的单个产品,可以满足更多的生产需求
很好的满⾜足OCP开放封闭原则
抽象工厂模式中我们可以定义实现不⽌一个接口,⼀个工厂也可以⽣成不⽌一个产品类 对于复杂对象的生产相当灵活易扩展
缺点:
扩展产品族相当麻烦 而且扩展产品族会违反OCP,因为要修改所有的⼯⼚
由于抽象⼯⼚模式是⼯⼚方法模式的扩展 总体的来说 很笨重
1、多个抽象产品类

package com.bit.src;

public interface Computer {
    void printComputer();
}
package com.bit.src;

public interface OperatingSystem  {
    void printSystem();
}

2、具体产品类

package com.bit.src;

public class MacBookComputer implements Computer {

    @Override
    public void printComputer() {
        System.out.println("MacBook电脑");
    }
}
package com.bit.src;

public class SurfaceBookComputer implements Computer{
    @Override
    public void printComputer() {
        System.out.println("SurfaceBook电脑");
    }
}

3、抽象工厂类 - 声明(一组)返回抽象产品的方法

package com.bit.src;

   public interface OperatingSystem  {
    void printSystem();
}
package com.bit.src;

public class MacSystem implements OperatingSystem {
    @Override
    public void printSystem() {
        System.out.println("Mac电脑系统");
    }
}
package com.bit.src;

public class Windows10System implements OperatingSystem {
    @Override
    public void printSystem() {
        System.out.println("Windows10系统");
    }
}

4、具体工厂类 - 生成(一组)具体产品

package com.bit.src;

public interface ComputerFactory {
        Computer createComputer();
        OperatingSystem createSystem();
}
package com.bit.src;

public class AppleFactory implements ComputerFactory {
    @Override
    public Computer createComputer() {
        return new MacBookComputer();
    }

    @Override
    public OperatingSystem createSystem() {
        return new MacSystem();
    }
}
package com.bit.src;

public class MsFactory implements ComputerFactory {

    @Override
    public Computer createComputer() {
        return new SurfaceBookComputer();
    }

    @Override
    public OperatingSystem createSystem() {
        return new Windows10System();
    }
}

5、客户端

package com.bit.src;
public class Client {

    public static void buyComputer(Computer computer){
        computer.printComputer();
    }
    public static void Use(OperatingSystem operatingSystem){
        operatingSystem.printSystem();
    }

    public static void main(String[] args) {
        ComputerFactory computerFactory=new MsFactory();
        ComputerFactory computerFactory2=new AppleFactory();
        Computer computer=computerFactory.createComputer();
        Computer computer2=computerFactory2.createComputer();
        OperatingSystem operatingSystem=computerFactory.createSystem();
        OperatingSystem operatingSystem2=computerFactory2.createSystem();
        buyComputer(computer);
        Use(operatingSystem);
        buyComputer(computer2);
        Use(operatingSystem2);

    }

代理设计模式
两个子类共同实现一个接口,其中一个子类负责真实业务实现,另外一个子类辅助真实业务主题的操作。

package com.bit.src;

public interface ISubject {
    void buyComputer();
}

package com.bit.src;

public class RealSubject implements ISubject{

    @Override
    public void buyComputer() {
        System.out.println("2,购买电脑");
    }
}

package com.bit.src;

public class DaiLISubject implements ISubject {
    private RealSubject realSubject;//真实的业务
    public DaiLISubject(RealSubject realSubject){
        this.realSubject=realSubject;
    }
    public void produceComputer(){
        System.out.println("1,生产电脑");
    }
    public void afterSale(){
        System.out.println("3,售后服务");
    }
    @Override
    public void buyComputer() {
        this.produceComputer();//真是操作前准备
        this.realSubject.buyComputer();//调用代理业务
        this.afterSale();//操作后结尾
    }
}

package com.bit.src;
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject=new RealSubject();
        DaiLISubject daiLISubject=new DaiLISubject(realSubject);
        daiLISubject.buyComputer();

    }

抽象类和接口的区别
区别一:结构组成
抽象类:普通方法+抽象方法

abstract class Person{
 public abstract void getPersonInfo();//抽象方法
}

接口:抽象方法+全局变量

public interface IMessage {
    String MSG="hello bit";
    void print();
}

区别二:权限不同
抽象类:各种权限
接口:public
区别三:子类的使用
抽象类:使用extends关键字继承象类
接口:使用implements关键字实现接口
区别四:关系
抽象类:一个抽象类可以实现若干接口

 abstract class QQMessagelmp implements IMessage ,INews{
 }
 

接口:接口不能继承抽象类,但是接口可以使用extends关键字继承多个父接口

public interface ISubject extends Computer {}

区别五:子类限制
抽象类:一个子类只能继承一个抽象类
接口:一个子类可以实现多接口

class QQMessagelmp implements IMessage ,INews,...{
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值