What is the difference between the template method and the strategy patterns?

后端 未结 16 2056
春和景丽
春和景丽 2020-12-07 07:11

Can someone please explain to me what is the difference between the template method pattern and the strategy pattern is?

As far as I can tell they are 99% the same -

16条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-07 07:34

    Template Pattern:

    Template method is about letting subclasses redefine certain steps of the algorithm, without changing the main structure and steps of the algorithm, defined in the base class. Template pattern usually uses inheritance, so a generic implementation of algorithms can be provided in the base class, which the subclass might choose to override if needed.

    public abstract class RobotTemplate {
        /* This method can be overridden by a subclass if required */
        public void start() {
            System.out.println("Starting....");
        }
    
        /* This method can be overridden by a subclass if required */
        public void getParts() {
            System.out.println("Getting parts....");
        }
    
        /* This method can be overridden by a subclass if required */
        public void assemble() {
            System.out.println("Assembling....");
        }
    
        /* This method can be overridden by a subclass if required */
        public void test() {
            System.out.println("Testing....");
        }
    
        /* This method can be overridden by a subclass if required */
        public void stop() {
            System.out.println("Stopping....");
        }
    
        /*
         * Template algorithm method made up of multiple steps, whose structure and
         * order of steps will not be changed by subclasses.
         */
        public final void go() {
            start();
            getParts();
            assemble();
            test();
            stop();
        }
    }
    
    
    /* Concrete subclass overrides template step methods as required for its use */
    public class CookieRobot extends RobotTemplate {
        private String name;
    
        public CookieRobot(String n) {
            name = n;
        }
    
        @Override
        public void getParts() {
            System.out.println("Getting a flour and sugar....");
        }
    
        @Override
        public void assemble() {
            System.out.println("Baking a cookie....");
        }
    
        @Override
        public void test() {
            System.out.println("Crunching a cookie....");
        }
    
        public String getName() {
            return name;
        }
    }
    

    Note in the above code, the go() algorithm steps will always be the same, but the subclasses might define a different recipe for performing a particular step.

    Strategy Pattern:

    Strategy pattern is about letting client selects concrete algorithms implementation at runtime. All algorithms are isolated and independent, but implement a common interface, and there is no notion of defining particular steps within the algorithm.

    /**
     * This Strategy interface is implemented by all concrete objects representing an
     * algorithm(strategy), which lets us define a family of algorithms.
     */
    public interface Logging {
        void write(String message);
    }
    
    /**
     * Concrete strategy class representing a particular algorithm.
     */
    public class ConsoleLogging implements Logging {
    
        @Override
        public void write(String message) {
            System.out.println(message); 
        }
    
    }
    
    /**
     * Concrete strategy class representing a particular algorithm.
     */
    public class FileLogging implements Logging {
    
        private final File toWrite;
    
        public FileLogging(final File toWrite) {
            this.toWrite = toWrite;
        }
    
        @Override
        public void write(String message) {
            try {
                final FileWriter fos = new FileWriter(toWrite);
                fos.write(message);
                fos.close();
            } catch (IOException e) {
                System.out.println(e);
            }
        }
    
    }
    

    For full source code, check out my github repository.

提交回复
热议问题